Вызов подпрограмм из лямбды в vb.net - PullRequest
1 голос
/ 07 октября 2009

Я часто вызываю функции из лямбд, поскольку предоставленный делегат не совпадает или не имеет достаточных параметров. Раздражает, что я не могу делать лямбду на подпрограммах. Каждый раз, когда я хочу сделать это, я должен обернуть свою подпрограмму в функцию, которая ничего не возвращает. Не красиво, но это работает.

Есть ли другой способ сделать это, чтобы сделать это более гладким / красивее?

Я читал, что вся эта лямбда-неадекватность, вероятно, будет исправлена ​​в VS2010 / VB10, поэтому мой вопрос скорее из любопытства.

Простой пример:

Public Class ProcessingClass
    Public Delegate Sub ProcessData(ByVal index As Integer)
    Public Function ProcessList(ByVal processData As ProcessData)
        ' for each in some list processData(index) or whatever'
    End Function
End Class

Public Class Main

    Private Sub ProcessingSub(ByVal index As Integer, _
                              ByRef result As Integer)
        ' (...) My custom processing '
    End Sub

    Private Function ProcessingFunction(ByVal index As Integer, _
                                        ByRef result As Integer) As Object
        ProcessingSub(index, result)
        Return Nothing
    End Function

    Public Sub Main()
        Dim processingClass As New ProcessingClass
        Dim result As Integer
        ' The following throws a compiler error as '
        ' ProcessingSub does not produce a value'
        processingClass.ProcessList( _
            Function(index As Integer) ProcessingSub(index, result))
        ' The following is the workaround that'
        ' I find myself using too frequently.'
        processingClass.ProcessList( _
            Function(index As Integer) ProcessingFunction(index, result))
    End Sub

End Class

Ответы [ 2 ]

1 голос
/ 13 ноября 2009

Если вы обнаружите, что делаете это слишком часто и, как правило, с однотипными данными, вы можете поместить делегата в класс.

Создайте базовый класс, который преобразуется в делегат:

Public MustInherit Class ProcessDataBase
    Public Shared Widening Operator CType(operand As ProcessDataBase) as ProcessingClass.ProcessData
        Return AddressOf operand.Process
    End Sub

    Protected MustOverride Sub Process(index As Integer)  
End Class

Наследование от класса:

Public Class ProcessResult
    Inherits ProcessDataBase

    Public Result As Integer

    Protected Overrides Sub Process(index as Integer)
        ' Your processing, result is modified.
    End SUb
End Class

Используйте это:

Public Class Main()
    Public Sub Main()
        Dim processingClass As New ProcessingClass
        Dim processor As New ProcessResult

        processingClass.ProcessList(processor)
        Dim result as integer=processor.Result
    End Sub
End Class
0 голосов
/ 07 октября 2009

Это исправлено в VB10, бета-версия VS10 доступна , если вы можете использовать ее. В VB10 у вас есть лямбда-выражения без возвращаемого значения и встроенные подпрограммы / функции.

Пока, может быть, вы могли бы просто забыть лямбды и работать вместо этого с делегатами? Что-то вроде:

processingClass.ProcessList(AddressOf ProcessingSub)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...