15

私がグーグルで見つけたものから、VB.NETには1ステートメントのラムダしかなく、複数ステートメントの無名関数はありません。しかし、私が読んだ記事はすべて古いバージョンの VB.NET に関するもので、vs2008 ベータ 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 にはラムダ式しかありません。

現在のバージョンでは「匿名デリゲート」はサポートされていませんが、VS2010 ではサポートされます (複数の行でサポートされます)。

現時点で唯一のオプションは、メソッドをどこかで宣言し、それを Addressof 演算子で渡すことです。

于 2009-03-22T21:25:42.210 に答える
9

VB9 には単一行の無名関数しかありません。VB10 では、完全なステートメントと複数行のラムダを追加しています。

于 2009-03-22T21:25:33.957 に答える
0

この例では、操作のリストがありますが、ID が一致する (T の) リストから 1 つだけを見つけたいと考えています。

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

operationID はメソッドに渡されるローカル変数であり、operations は一般的なリストです。

于 2013-11-26T10:24:23.480 に答える
-1

匿名はデリゲートまたは関数ではなく、強力な動的タイプです

ジェネリック関数を使用できます

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 に答える