Condividi tramite


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

Annotazioni

Le espressioni lambda offrono 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 supportati dalle espressioni lambda. In tutti gli altri casi, un'espressione lambda è un modo preferito per scrivere codice inline. È possibile usare le eliminazioni 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 static modificatore 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.

Si usa anche la delegate parola chiave per dichiarare un tipo delegato.

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;

Specificazione del linguaggio C#

Per ulteriori informazioni, consultare la sezione espressioni di funzione anonime della specifica del linguaggio C# .

Vedere anche