2013-02-23 5 views
8

:Differenza tra i vari modi di istanziare un delegato (Func <T, T>)?

Func<int, int> myFunc = new Func<int,int>(delegate(int x) { 
    return x + 1; 
}); 

:

Func<int, int> myFunc = delegate(int x) { 
    return x + 1; 
}; 

:

Func<int, int> myFunc = x => x + 1; 

Qual è la differenza tra loro?

+0

duplicato del [delegato parola chiave contro la notazione lambda] (http://stackoverflow.com/questions/208381/whats-the-difference-between-anonymous-methods-c-2-0- e-lambda-espressioni) e [Qual è la differenza tra la nuova Action() e una lambda?] (http://stackoverflow.com/questions/765966/what-is-the-difference-tra between-new-action-and -a-lambda) – nawfal

risposta

7

Sono tutti uguali. I primi due sono esempi di anonymous methods. L'ultimo è un esempio di lambda expression. I metodi anonimi e le espressioni lambda sono chiamati collettivamente funzioni anonime.

Sono stati introdotti metodi anonimi in C# 2; le espressioni lambda sono state introdotte nel C# 3 e per lo più hanno sostituito metodi anonimi. Si noti che le espressioni lambda possono anche essere convertite in expression trees che rappresentano il codice come dati anziché come IL e delegati.

Nota che Func<TResult>, Func<T, TResult> ecc. Sono solo esempi di tipi di delegati. È possibile convertire le funzioni anonime in qualsiasi tipo di delegato compatibile. Per esempio:

public delegate int Foo(string x); 

Foo foo = text => text.Length; 
+0

Quindi qual è la differenza tra la funzione anonima e Func? Sono uguali? –

+0

@Lior: 'Func' è solo il nome di un tipo delegato. –

+0

grazie mille :) –

8

Sono tutti uguali: solo lo syntactic sugar che compila la stessa cosa.

Che è - con l'inferenza dei tipi e altre chicche del compilatore, 3 è solo una molto molto breve modo di dire 1.

+0

Quindi qual è la differenza tra la funzione anonima e Func? Sono uguali? –

+0

@Lior - 'Func' è un delegato definito. Una funzione anonima non ha un tipo di delegato denominato. – Oded

+0

@Lior, Sì, sono uguali in fase di esecuzione ma c'è differenza nel modo in cui li definisci per far capire al compilatore che è un delegato che accetta questi molti tipi specifici di parametri e restituisce un tipo specifico. – Somnath