15

从我在 google 上可以找到的内容来看,VB.NET 只有一个语句 lambda,而不是多语句匿名函数。但是,我阅读的所有文章都在谈论旧版本的 VB.NET,我找不到比 vs2008 beta 1 或 2 更新的任何东西。

所以问题是:我如何在 VB.NET 中做到这一点?

C#代码:

private void HandleErrors( Action codeBlock ){
    try{
        codeBlock();
    }catch(Exception e){
        //log exception, etc
    }
}

HandleErrors(() => {
    var x = foo();
    x.DoStuff();
    etc
});
4

6 回答 6

31

它在 VB10 中:

Dim food = New With {
    .ID = 1,
    .Name = "Carrot",
    .Type = (
        Function(name As String)
            If String.IsNullOrEmpty(name) Then Return String.Empty

            Select Case name.ToLower()
                Case "apple", "tomato": Return "Fruit"
                Case "potato": Return "Vegetable"
            End Select

            Return "Meat"
        End Function
    )(.Name)
}
Dim type = food.Type

或者,对应于您的代码:

Sub HandleErrors(codeBlock As Action)
    Try
        codeBlock()
    Catch e As Exception
        ' log exception, etc.
    End Try
End Sub

HandleErrors(Sub()
        Dim x = foo()
        x.DoStuff()
        ' etc.
    End Sub)
于 2011-05-22T23:44:54.923 回答
18

Visual Basic .NET 只有 lambda 表达式。

它在当前版本中不支持“匿名代表”,但在 VS2010 中它会(并且在多行上)。

现在唯一的选择是在某处声明您的方法并使用 Addressof 运算符传递它。

于 2009-03-22T21:25:42.210 回答
9

VB9 只有单行匿名函数。我们在 VB10 中添加了完整的语句和多行 lambda。

于 2009-03-22T21:25:33.957 回答
0

在此示例中,我有一个操作列表,但只想从 ID 匹配的(T)列表中找到一个:

Return operations.Find(Function(p) p.OperationID = operationID)

operationID 是传入方法的局部变量,而 operations 是通用列表。

于 2013-11-26T10:24:23.480 回答
-1

Anonymous 不是委托或函数,它是一种强大的动态类型

你可以使用泛型函数

Sub Main()
      Dim PersonDynamicType = AnonyFunc(New With {.Name = "david", .Family = "Fisher"})
      Console.Write(PersonDynamicType.Name)
End Sub

Function AnonyFunc(Of t)(v As t) As t
      Return v
End Function
于 2015-06-20T13:10:10.597 回答
-5

这是不准确的。VB.NET 实际上确实有匿名方法。这是一个例子:

Private Function JsonToObject(Of T)(Value As String) As T
    Dim JavaScriptSerializer As New System.Web.Script.Serialization.JavaScriptSerializer()
    Return JavaScriptSerializer.Deserialize(Of T)(Value)
End Function

Dim People As Generic.List(Of Person) = JsonToObject(Of Generic.List(Of Person))(Json)
于 2012-02-06T14:05:07.270 回答