2009-03-22 27 views
13

Según lo que puedo encontrar en google, VB.NET solo tiene lambdas de una declaración y no funciones anónimas de varias declaraciones. Sin embargo, todos los artículos que leí estaban hablando de versiones anteriores de VB.NET, no pude encontrar nada más reciente que vs2008 beta 1 o 2.¿VB.NET tiene funciones anónimas?

Entonces la pregunta: ¿Cómo puedo hacer esto en VB.NET?

código C#:

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

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

Respuesta

26

lo hace en 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 
+5

buen ejemplo ... aunque no sabía que las zanahorias eran carne :) –

+0

zanahorias: ¡prueba la única carne de naranja! – Fredulom

9

VB9 sólo tiene funciones anónimas de una sola línea. Estamos agregando declaraciones completas y lambdas de varias líneas en VB10.

18

Visual Basic .NET solo tiene expresiones lambda.

No es compatible con los delegados anónimos" en la versión actual, aunque lo hará (y en varias líneas, por cierto) en VS2010.

En este momento la única opción es declarar su método de algún lugar y pasarlo con el operador AddressOf

+0

lamentablemente esto es un gran agujero abierto que pienso. No puedo esperar a que esto sea incluido. Por otro lado, hicieron un buen trabajo en la sintaxis de consulta XML litterals y soporte LinqToXML ... –

+0

Aquí hay un buen artículo de cOdE mag habla sobre métodos anónimos y expresiones lambda http: //www.code-magazine. com/Article.aspx? quickid = 0809081 –

-4

Esto es inexacto VB.NET tiene efectivamente métodos anónimos he aquí un ejemplo:..

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) 
+6

¿dónde está el método anónimo en ese fragmento de código? – Lucas

+2

Se llama JsonToObject. Lo siento no pude evitarlo: P – Spyros

0

en este ejemplo tengo una lista de operaciones, pero sólo quiero encontrar uno de una lista (de T), donde el partido IDs:

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

operationID es una variable local aprobada en el método y las operaciones es una lista genérica

0

Anonymous no es un delegado o función que es un tipo fuerte dinámica

puede utilizar las funciones genéricas

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 
Cuestiones relacionadas