2009-05-21 3 views
7

Ho cercato in alto e in basso la documentazione su come utilizzare questa funzione. Mentre il ciclo I potrebbe scrivere sarebbe semplice e non richiedere tempo, mi piacerebbe davvero imparare come usarlo.Azione (di T) in Visual Basic in List (Of T). Per ogni

Fondamentalmente ho una classe, ad esempio, Widget, con un sub Save() che non restituisce nulla. Quindi:

Dim w as New Widget() 
w.Save() 

salva fondamentalmente il widget. Ora supponiamo di avere una collezione generica List(Of Widget) nome widgetList(Of Widget) e voglio eseguire un Save() su ciascun elemento in tale elenco. Dice che posso fare un

widgetList.ForEach([enter Action(Of T) here]) 

.... ma come in F funziona ??? Non c'è documentazione da nessuna parte sugli intrablags. L'aiuto sarebbe molto apprezzato.

+0

ps ho fatto qualche ricerca sulle funzioni lambda e ho provato alcune di quelle tecniche, ma non sono riuscito a far funzionare nessuno di loro ... ugh ... – Jason

+0

Se si utilizza Visual Studio 2005 non si avrà accesso alle espressioni Lamda in VB –

risposta

11

Se stai usando VB9 (VS2008) Io non credo che sarete in grado di utilizzare una funzione anonima facilmente - per quanto io sappia, funzioni anonime in VB9 hanno per essere funzioni reali (cioè devono restituire un valore) mentre Action<T> non restituisce nulla. C# i metodi anonimi 2 di e C# 3 di espressioni lambda sono più generale, che è il motivo per cui si vedrà carichi di esempi che utilizzano da C# e pochissimi utilizzando VB :(

si potrebbe scrivere un involucro MakeAction che prende un .. Function<T,TResult> e restituisce un Action<T>, ma ho il sospetto altre restrizioni funzioni anonime VB9 renderebbe questo impraticabile

La buona notizia è che VB10 has much more anonymous function support (C# 4 e VB10 stanno guadagnando le rispettive caratteristiche - credo che MS sta cercando di andare per la parità linguistica da ora in poi, in misura maggiore rispetto a prima.)

Fino ad allora, per utilizzare è necessario scrivere un appropriato Sub e utilizzare AddressOf per creare un delegato da esso. Ecco un piccolo esempio:

Imports System 
Imports System.Collections.Generic 

Public Class Test 

    Shared Sub Main() 
     Dim names as New List(Of String) 
     names.Add("Jon") 
     names.Add("Holly") 
     names.ForEach(AddressOf PrintMe) 

    End Sub 

    Shared Sub PrintMe(ByVal text as String) 
     Console.WriteLine(text) 
    End Sub 

End Class 
+0

grazie, e grazie per l'esempio! Vorrei che ci fosse un modo migliore di ingombrare il mio già crescente elenco di funzioni di classe, ma questo funziona per ora! – Jason

+0

Non è proprio così pratico .. è? –

-1

Il seguente dovrebbe funzionare anche se non sono al passo con VB.Net quindi potrebbe essere necessario regolare di conseguenza.

widgetList.ForEach(w => w.Save()) 
+1

questo è il problema ... C# e VB differiscono molto su questo, quindi ho bisogno della sintassi VB ..... – Jason

0

Supponendo che VB non supporta le espressioni lambda, è possibile creare un'istanza della Azione (T) delegato in VB utilizzando questa sintassi:

new Action(Of T)(AddressOf Widget.Save) 
12

bene, 'm davvero obsoleto ora ... :-) ma in VB è:

widgetList.ForEach(Sub(w) w.Save()) 

o, più complicato:

widgetList.ForEach(New Action(Of Widged)(Sub(w As Widged) w.Save())) 
+0

Questa non dovrebbe essere la risposta? – Lopsided

1
new Action(Of T)(AddressOf Widget.Save) 

OK se Widget ha una funzione pubblica denominata Save.

Tutti gli altri commenti sono falsi quando lo provo.