Operatore delegate
L'operatore delegate
crea un metodo anonimo che può essere convertito in un tipo delegato. Un metodo anonimo può essere convertito in tipi come System.Action e System.Func<TResult> utilizzati come argomenti in molti metodi.
Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4)); // output: 7
Nota
Le espressioni lambda forniscono un modo più conciso ed espressivo per creare una funzione anonima. Usare l'operatore => per costruire un'espressione lambda:
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.
Quando si usa l'operatore delegate
, è possibile omettere l'elenco di parametri. In tal caso, il metodo anonimo creato può essere convertito in un tipo delegato con qualsiasi elenco di parametri, come illustrato nell'esempio seguente:
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. In tutti gli altri casi, un'espressione lambda è la modalità preferita per scrivere codice inline. È possibile usare le variabili discard per specificare due o più parametri di input di un metodo anonimo che non vengono usati dal metodo:
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 solo un singolo parametro è denominato _
, _
viene considerato come il nome di tale parametro all'interno di un metodo anonimo.
È possibile usare il modificatore static
nella dichiarazione di un metodo anonimo:
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 variabili locali o lo stato dell'istanza dall'inclusione di ambiti.
È anche possibile usare la parola chiave delegate
per dichiarare un tipo delegato.
A partire da C# 11, il compilatore può memorizzare nella cache l'oggetto delegato creato da un gruppo di metodi. Si consideri il metodo seguente:
static void StaticFunction() { }
Quando si assegna il gruppo di metodi a un delegato, il compilatore memorizza nella cache il delegato:
Action a = StaticFunction;
Prima di C# 11, era necessario usare un'espressione lambda per riutilizzare un singolo oggetto delegato:
Action a = () => StaticFunction();
Specifiche del linguaggio C#
Per altre informazioni, vedere la sezione Espressioni di funzioni anonime della specifica del linguaggio C#.
Vedi anche
- Operatori ed espressioni C#
- Operatore =>