2013-02-23 13 views
8

:Różnica między różnymi sposobami tworzenia delegata (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; 

Jaka jest różnica między nimi?

+0

duplikat [delegata hasła porównaniu notacji lambda] (http://stackoverflow.com/questions/208381/whats-the-difference-between-anonymous-methods-c-2-0- i-wyrażenia lambda) i [Jaka jest różnica między nową akcją() i lambdą?] (http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and -a-lambda) – nawfal

Odpowiedz

7

Są takie same. Pierwsze dwa to przykłady anonymous methods. Ostatni jest przykładem lambda expression. Metody anonimowe i wyrażenia lambda są wspólnie nazywane anonimowymi funkcjami.

Metody anonimowe zostały wprowadzone w C# 2; Wyrażenia lambda zostały wprowadzone w C# 3 i w większości zastąpiły metody anonimowe. Zauważ, że wyrażenia lambda można również przekonwertować na expression trees, które reprezentują kod jako dane zamiast IL, a także delegatów.

Pamiętaj, że Func<TResult>, Func<T, TResult> itd. To tylko przykłady typów delegatów. Można konwertować funkcje anonimowe na dowolny zgodny typ delegata. Np

public delegate int Foo(string x); 

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

Jaka jest różnica między funkcją anonimową a Func? Czy są one takie same? –

+0

@Lior: 'Func' to tylko nazwa typu delegata. –

+0

dziękuję bardzo :) –

8

Wszystkie są takie same - po prostu syntactic sugar, które kompilują się do tego samego.

To jest - z rodzaju wnioskowania i innych smakołyków kompilatora, 3 jest po prostu bardzo, bardzo krótki sposób powiedzieć 1.

+0

Czym więc różni się funkcja anonimowa od Func? Czy są one takie same? –

+0

@Lior - 'Func' jest zdefiniowanym delegatem. Anonimowa funkcja nie ma nazwanego typu delegata. – Oded

+0

@Lior, Tak, są takie same w czasie wykonywania, ale istnieje różnica w sposobie definiowania ich, aby kompilator rozumiał, że jest to delegat, który akceptuje te wiele specyficznych typów parametrów i zwraca określony typ. – Somnath