2009-03-22 13 views
13

Da quello che posso trovare su google, VB.NET ha solo lambdas con una sola istruzione e non funzioni di anteprime multipla. Tuttavia, tutti gli articoli che ho letto stavano parlando delle vecchie versioni di VB.NET, non ho trovato nulla di più recente di vs2008 beta 1 o 2.VB.NET ha funzioni anonime?

Quindi la domanda: Come posso fare questo in VB.NET?

codice C#:

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

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

risposta

26

lo fa in 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

ottimo esempio ... anche se non avevo capito che le carote erano carne :) –

+0

carote: prova l'unica carne all'arancia! – Fredulom

9

VB9 ha solo funzioni anonime a linea singola. Stiamo aggiungendo full statement e lambda multi-line in VB10.

18

Visual Basic .NET ha solo espressioni lambda.

Non supporta 'delegati anonimi" nella versione attuale, anche se sarà (e su più righe a quello) in VS2010.

In questo momento l'unica opzione è quella di dichiarare il metodo da qualche parte e passarlo con l'operatore AddressOf

+0

purtroppo questo è un grosso buco che penso. Non vedo l'ora che questo sia incluso. D'altra parte, hanno fatto un buon lavoro sulla sintassi della query Litter XML e supporto LinqToXML ... –

+0

Ecco un buon articolo di cOdE mag i discorsi sui metodi anonimi e le espressioni lambda http: //www.code-magazine. com/Article.aspx? quickid = 0809081 –

-4

Questo è imprecisa VB.NET in effetti sono i metodi anonimi Ecco un esempio:..

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

dov'è il metodo anonimo in quello snippet di codice? – Lucas

+2

Si chiama JsonToObject. Mi dispiace non potrei aiutare me stesso: P – Spyros

0

in questo esempio ho una lista di operazioni, ma solo voglia di trovarne uno da un elenco (T), dove la partita ID:

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

operationID è una variabile locale passata al metodo e le operazioni è una lista generica.

0

Anonymous non è un delegato o una funzione è un tipo forte dinamica

è possibile utilizzare funzioni generiche

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