2009-04-17 13 views

risposta

4

Non proprio no. Sono essenzialmente la stessa identica funzione con diversi costrutti di sintassi. Lo spostamento generale sembra essere lontano dalla sintassi del metodo anonimo C# 2.0 verso la sintassi di stile lambda sia per le espressioni anonime che per le funzioni.

15

Un'espressione lambda è semplicemente sintassi di scelta rapida per un metodo anonimo. i metodi anonimi simile a questa:

delegate(params) {method body} 

L'espressione lambda equivalente sarebbe simile a questa:

params => method body 

In breve, tutte le espressioni lambda sono metodi anonimi, ma è possibile avere un metodo anonimo che è non scritto nella sintassi lambda (come il primo esempio sopra). Spero che questo sia utile!

+0

+1, ma non sono espressioni lambda che reinventano la ruota (piuttosto male, come se i metodi anonimi avessero più senso). –

+0

quindi l'espressione lambada NON può avere valore di ritorno? mentre il metodo anonimo può? –

+1

SnOrfus: sì, fanno la stessa cosa, quindi hai ragione, è solo una questione di preferenza per la sintassi.Sasha: sia lambdas che metodi anonimi possono avere valori di ritorno. –

6

espressioni lambda possono essere convertiti in alberi di espressione, mentre i delegati anonimi non possono.

5

Solo espressione lambda senza metodo corpo può essere convertito in albero di espressione

seguenti costrutti DO di compilazione:

  Func<int> exp1 =() => 1; 
      Func<int> exp2 =() => { return 1; }; 
      Func<int> exp3 = delegate { return 1; }; 
      Expression<Func<int>> exp4 =() => 1; 

E seguendo lo fanno non

Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates 
Expression<Func<int>> exp6 =() => { return 1; }; //or lambdas with block body 

Quindi non v'è differenza anche a livello non molto avanzato (quello di Jon Sk eet punta a questo punto sick difference example)

Un'altra differenza è che è possibile creare delegati anonimi senza elenco parametri se non si prevede di utilizzarli all'interno del metodo body, con lambda è sempre necessario fornire parametri.

due righe seguenti mostrano la differenza

Func<int, int, int, int, int> anonymous = delegate { return 1; }; 
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1; 

Fate essenzialmente la stessa cosa, ma delegato anonima chiaramente un aspetto migliore qui.

Problemi correlati