Использование Action (Of T ...) над пользовательским синтаксисом делегата для удобства чтения - PullRequest
1 голос
/ 07 января 2011

Начиная с .net 4.0, это новый этикет для использования синтаксиса, такого как:

Private Sub Main()
    MyMethod(AddressOf AnAction)
End Sub

Private Sub MyMethod(ByVal toDo As Action(Of String, Integer, Boolean))
    toDo.Invoke("Tom", 1, True)
End Sub

Private Sub AnAction(ByVal p1 As String, ByVal p2 As Integer, ByVal p3 As Boolean)
End Sub

В отличие от:

Private Delegate Sub MyActionDlg(ByVal p1 As String, ByVal p2 As Integer, ByVal p3 As Boolean)

Private Sub Main()
    MyMethod(AddressOf AnAction)
End Sub

Private Sub MyMethod(ByVal toDo As MyActionDlg)
    toDo.Invoke("Tom", 1, True)
End Sub

Private Sub AnAction(ByVal p1 As String, ByVal p2 As Integer, ByVal p3 As Boolean)
End Sub

То же самое относится и к Tuples / Func. Приятно писать, но местами чувствует себя немного неаккуратно. Зачем кому-то нужен Tuple (Of T, T2, T3, T4) поверх классного типа? Мой настоящий фрагмент кода имеет эти вложенные элементы, поэтому он передает действие в цепочке методов.

Извините за пример VB, AddressOf - это просто VBs способ сказать new Action(AnAction). Также я просто записал это в браузер, чтобы он тоже не компилировался.

Как люди относятся к чтению и использованию этих общих действий компилятора в отличие от надлежащих специальных сущностей, созданных для их точных требований в решении?

1 Ответ

3 голосов
/ 07 января 2011

Новые делегаты Func и Action предпочтительнее для простых делегатов, таких как sed в методах LINQ.

Если использование Func s или Action s приведет к нечитаемым типам имен, вам, безусловно, следует определить своих собственных делегатов.

В общем, вы должны выбрать дизайн, который дает наиболее читаемый код.

...