Operatore delegate (Riferimenti per C#)delegate operator (C# reference)

L'operatore delegate crea un metodo anonimo che può essere convertito in un tipo delegato:The delegate operator creates an anonymous method that can be converted to a delegate type:

Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4));  // output: 7

Nota

A partire da C# 3, le espressioni lambda forniscono un modo più conciso ed espressivo per creare una funzione anonima.Beginning with C# 3, lambda expressions provide a more concise and expressive way to create an anonymous function. Usare l'operatore => per costruire un'espressione lambda:Use the => operator to construct a lambda expression:

Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4));  // output: 7

Per altre informazioni sulle funzionalità delle espressioni lambda, ad esempio l'acquisizione di variabili esterne, vedere Espressioni lambda.For more information about features of lambda expressions, for example, capturing outer variables, see Lambda expressions.

Quando si usa l'operatore delegate, è possibile omettere l'elenco di parametri.When you use the delegate operator, you might omit the parameter list. In tal caso, il metodo anonimo creato può essere convertito in un tipo delegato con qualsiasi elenco di parametri, come illustrato nell'esempio seguente:If you do that, the created anonymous method can be converted to a delegate type with any list of parameters, as the following example shows:

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!

Questa è l'unica funzionalità di metodi anonimi non supportata dalle espressioni lambda.That's the only functionality of anonymous methods that is not supported by lambda expressions. In tutti gli altri casi, un'espressione lambda è la modalità preferita per scrivere codice inline.In all other cases, a lambda expression is a preferred way to write inline code.

A partire da C# 9,0, è possibile usare le variabili Discard per specificare due o più parametri di input di un metodo anonimo che non vengono usati dal metodo:Beginning with C# 9.0, you can use discards to specify two or more input parameters of an anonymous method that aren't used by the method:

Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4));  // output: 42

Per la compatibilità con le versioni precedenti, se un solo parametro è denominato _ , _ viene considerato come nome del parametro all'interno di un metodo anonimo.For backwards compatibility, if only a single parameter is named _, _ is treated as the name of that parameter within an anonymous method.

A partire da C# 9,0, è anche possibile usare il static modificatore nella dichiarazione di un metodo anonimo:Also beginning with C# 9.0, you can use the static modifier at the declaration of an anonymous method:

Func<int, int, int> sum = static delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(10, 4));  // output: 14

Un metodo anonimo statico non può acquisire le variabili locali o lo stato dell'istanza dagli ambiti di inclusione.A static anonymous method can't capture local variables or instance state from enclosing scopes.

È anche possibile usare la parola chiave delegate per dichiarare un tipo delegato.You also use the delegate keyword to declare a delegate type.

Specifiche del linguaggio C#C# language specification

Per altre informazioni, vedere la sezione Espressioni di funzioni anonime della specifica del linguaggio C#.For more information, see the Anonymous function expressions section of the C# language specification.

Vedere ancheSee also