Есть ли в VB.NET анонимные функции? - PullRequest
14 голосов
/ 23 марта 2009

Из того, что я могу найти в Google, VB.NET имеет только лямбды с одним утверждением, а не анонимные функции с несколькими утверждениями. Тем не менее, все статьи, которые я читал, говорили о старых версиях 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
});

Ответы [ 6 ]

28 голосов
/ 23 мая 2011

В 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
18 голосов
/ 23 марта 2009

Visual Basic .NET имеет только лямбда-выражения.

Он не поддерживает «анонимных делегатов» в текущей версии, хотя он будет (и в нескольких строках) в VS2010.

Прямо сейчас единственный вариант - объявить ваш метод где-нибудь и передать его с помощью оператора Addressof.

9 голосов
/ 23 марта 2009

VB9 имеет только однострочные анонимные функции. Мы добавляем полный оператор и многострочные лямбды в VB10.

0 голосов
/ 20 июня 2015

Аноним не является делегатом или функцией это сильный динамический тип

Вы можете использовать общие функции

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
0 голосов
/ 26 ноября 2013

в этом примере у меня есть список операций, но я хочу найти только одну из списка (из T), где идентификаторы совпадают:

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

operationID - это локальная переменная, переданная методу, а операции - общий список.

0 голосов
/ 06 февраля 2012

Это неточно. 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)
...