delegálási operátor
Az delegate
operátor létrehoz egy névtelen metódust, amely delegált típussá alakítható. A névtelen metódusok átalakíthatók olyan típusokra, mint például System.Action az System.Func<TResult> argumentumként használt típusok számos metódusra.
Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4)); // output: 7
Feljegyzés
A Lambda-kifejezések tömörebb és kifejezőbb módot biztosítanak egy névtelen függvény létrehozásához. A => operátorral lambdakifejezést hozhat létre:
Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4)); // output: 7
A lambdakifejezések funkcióiról, például a külső változók rögzítéséről további információt a Lambda-kifejezésekben talál.
Az operátor használatakor delegate
kihagyhatja a paraméterlistát. Ha így tesz, a létrehozott névtelen metódus bármilyen paraméterlistával delegált típussá alakítható, ahogyan az alábbi példa is mutatja:
Action greet = delegate { Console.WriteLine("Hello!"); };
greet();
Action<int, double> introduce = delegate { Console.WriteLine("This is world!"); };
introduce(42, 2.7);
// Output:
// Hello!
// This is world!
A lambdakifejezések nem támogatják a névtelen metódusok egyetlen funkcióját. Minden más esetben a lambda kifejezés a beágyazott kódok írásának előnyben részesített módja. Elvetésekkel megadhat két vagy több olyan bemeneti paramétert egy névtelen metódushoz, amelyeket a metódus nem használ:
Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4)); // output: 42
A visszamenőleges kompatibilitás érdekében, ha csak egyetlen paraméter neve van elnevezve _
, _
a rendszer a paraméter neveként kezeli egy névtelen metóduson belül.
A módosító egy static
névtelen metódus deklarálásánál használható:
Func<int, int, int> sum = static delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(10, 4)); // output: 14
A statikus névtelen metódusok nem tudják rögzíteni a helyi változókat vagy a példány állapotát a hatókörökből.
A kulcsszóval delegate
deklarálhat deklarált típust is.
A C# 11-től kezdődően a fordító gyorsítótárazhatja a metóduscsoportból létrehozott delegált objektumot. Fontolja meg a következő módszert:
static void StaticFunction() { }
Amikor hozzárendeli a metóduscsoportot egy meghatalmazotthoz, a fordító gyorsítótárazza a meghatalmazottat:
Action a = StaticFunction;
A C# 11 előtt egy lambda kifejezést kell használnia egyetlen delegált objektum újrafelhasználásához:
Action a = () => StaticFunction();
C# nyelvspecifikáció
További információ: A C# nyelv specifikációjának Névtelen függvénykifejezések szakasza.