Condividi tramite


Delegate Classe

Definizione

Rappresenta un delegato, ovvero una struttura di dati che fa riferimento a un metodo statico o a un'istanza di classe e a un metodo di istanza di tale classe.

public ref class Delegate abstract
public ref class Delegate abstract : ICloneable, System::Runtime::Serialization::ISerializable
public abstract class Delegate
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
type Delegate = class
type Delegate = class
    interface ICloneable
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
type Delegate = class
    interface ICloneable
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Delegate = class
    interface ICloneable
    interface ISerializable
Public MustInherit Class Delegate
Public MustInherit Class Delegate
Implements ICloneable, ISerializable
Ereditarietà
Delegate
Derivato
Attributi
Implementazioni

Commenti

La classe Delegate è la classe base per i tipi delegati. Tuttavia, solo il sistema e i compilatori possono derivare in modo esplicito dalla classe Delegate o dalla classe MulticastDelegate. Non è inoltre consentito derivare un nuovo tipo da un tipo delegato. La classe Delegate non è considerata un tipo delegato; è una classe usata per derivare i tipi delegati.

La maggior parte dei linguaggi implementa una parola chiave delegate e i compilatori per tali linguaggi sono in grado di derivare dalla classe MulticastDelegate; pertanto, gli utenti devono usare la parola chiave delegate fornita dalla lingua.

Nota

Common Language Runtime fornisce un metodo Invoke per ogni tipo di delegato, con la stessa firma del delegato. Non è necessario chiamare questo metodo in modo esplicito da C#, Visual Basic o Visual C++, perché i compilatori lo chiamano automaticamente. Il metodo Invoke è utile in reflection quando si desidera trovare la firma del tipo delegato.

Common Language Runtime fornisce a ogni tipo delegato metodi BeginInvoke e EndInvoke per abilitare la chiamata asincrona del delegato. Per altre informazioni su questi metodi, vedere Chiamata di metodi sincroni in modo asincrono.

La dichiarazione di un tipo delegato stabilisce un contratto che specifica la firma di uno o più metodi. Un delegato è un'istanza di un tipo delegato con riferimenti a:

  • Metodo di istanza di un tipo e un oggetto di destinazione assegnabile a tale tipo.

  • Metodo di istanza di un tipo, con il parametro nascosto this esposto nell'elenco di parametri formali. Si dice che il delegato sia un delegato di istanza aperto.

  • Metodo statico.

  • Metodo statico e oggetto di destinazione assegnabile al primo parametro del metodo . Si dice che il delegato venga chiuso sul primo argomento.

Per altre informazioni sull'associazione di delegati, vedere l'overload del metodo CreateDelegate(Type, Object, MethodInfo, Boolean).

Quando un delegato rappresenta un metodo di istanza chiuso sul primo argomento (il caso più comune), il delegato archivia un riferimento al punto di ingresso del metodo e un riferimento a un oggetto, denominato destinazione, che è di un tipo assegnabile al tipo che ha definito il metodo. Quando un delegato rappresenta un metodo di istanza aperto, archivia un riferimento al punto di ingresso del metodo. La firma del delegato deve includere il parametro this nascosto nell'elenco dei parametri formali; in questo caso, il delegato non dispone di un riferimento a un oggetto di destinazione e un oggetto di destinazione deve essere fornito quando viene richiamato il delegato.

Quando un delegato rappresenta un metodo statico, il delegato archivia un riferimento al punto di ingresso del metodo. Quando un delegato rappresenta un metodo statico chiuso sul primo argomento, il delegato archivia un riferimento al punto di ingresso del metodo e un riferimento a un oggetto di destinazione assegnabile al tipo del primo argomento del metodo. Quando il delegato viene richiamato, il primo argomento del metodo statico riceve l'oggetto di destinazione. Questo primo argomento deve essere un tipo riferimento.

L'elenco chiamate di un delegato è un set ordinato di delegati in cui ogni elemento dell'elenco richiama esattamente uno dei metodi rappresentati dal delegato. Un elenco chiamate può contenere metodi duplicati. Durante una chiamata, i metodi vengono richiamati nell'ordine in cui vengono visualizzati nell'elenco chiamate. Un delegato tenta di richiamare ogni metodo nell'elenco chiamate; i duplicati vengono richiamati una volta per ogni volta che vengono visualizzati nell'elenco chiamate. I delegati non sono modificabili; una volta creato, l'elenco chiamate di un delegato non cambia.

I delegati vengono definiti multicast o combinabili, perché un delegato può richiamare uno o più metodi e può essere usato nella combinazione di operazioni.

La combinazione di operazioni, ad esempio Combine e Remove, non modifica i delegati esistenti. In alternativa, tale operazione restituisce un nuovo delegato che contiene i risultati dell'operazione, un delegato non modificato o null. Un'operazione di combinazione restituisce null quando il risultato dell'operazione è un delegato che non fa riferimento ad almeno un metodo. Un'operazione di combinazione restituisce un delegato invariato quando l'operazione richiesta non ha alcun effetto.

Nota

I linguaggi gestiti usano i metodi Combine e Remove per implementare operazioni delegate. Gli esempi includono le istruzioni AddHandler e RemoveHandler in Visual Basic e gli operatori += e -= sui tipi delegati in C#.

A partire da .NET Framework 4, i tipi delegati generici possono avere parametri di tipo varianti. I parametri di tipo controvariante possono essere usati come tipi di parametro del delegato e un parametro di tipo covariante può essere usato come tipo restituito. Questa funzionalità consente ai tipi delegati generici costruiti dalla stessa definizione di tipo generico di essere compatibili con l'assegnazione se i relativi argomenti di tipo sono tipi di riferimento con una relazione di ereditarietà, come illustrato in Covarianza e controvarianza.

Nota

I delegati generici compatibili con l'assegnazione a causa della varianza non sono necessariamente combinabili. Per essere combinabile, i tipi devono corrispondere esattamente. Si supponga, ad esempio, che una classe denominata Derived sia derivata da una classe denominata Base. Un delegato di tipo Action<Base> (Action(Of Base) in Visual Basic) può essere assegnato a una variabile di tipo Action<Derived>, ma i due delegati non possono essere combinati perché i tipi non corrispondono esattamente.

Se un metodo richiamato genera un'eccezione, il metodo interrompe l'esecuzione, l'eccezione viene passata al chiamante del delegato e i metodi rimanenti nell'elenco chiamate non vengono richiamati. L'intercettazione dell'eccezione nel chiamante non modifica questo comportamento.

Quando la firma dei metodi richiamati da un delegato include un valore restituito, il delegato restituisce il valore restituito dell'ultimo elemento nell'elenco chiamate. Quando la firma include un parametro passato per riferimento, il valore finale del parametro è il risultato di ogni metodo nell'elenco chiamate eseguito in sequenza e aggiornando il valore del parametro.

L'equivalente più vicino di un delegato in C è un puntatore a funzione. Un delegato può rappresentare un metodo statico o un metodo di istanza. Quando il delegato rappresenta un metodo di istanza, il delegato archivia non solo un riferimento al punto di ingresso del metodo, ma anche un riferimento all'istanza della classe. A differenza dei puntatori a funzione, i delegati sono orientati agli oggetti e indipendenti dai tipi.

Per esempi, vedere osservazioni supplementari dell'API per System.Delegate.CreateDelegate.

Costruttori

Delegate(Object, String)

Inizializza un delegato che richiama il metodo di istanza specificato nell'istanza di classe specificata.

Delegate(Type, String)

Inizializza un delegato che richiama il metodo statico specificato dalla classe specificata.

Proprietà

HasSingleTarget

Ottiene un valore che indica se il Delegate ha una singola destinazione di chiamata.

Method

Ottiene il metodo rappresentato dal delegato.

Target

Ottiene l'istanza della classe in cui il delegato corrente richiama il metodo dell'istanza.

Metodi

Clone()

Crea una copia superficiale del delegato.

Combine(Delegate, Delegate)

Concatena gli elenchi di chiamate di due delegati.

Combine(Delegate[])

Concatena gli elenchi di chiamate di una matrice di delegati.

Combine(ReadOnlySpan<Delegate>)

Concatena gli elenchi di chiamate di un intervallo di delegati.

CombineImpl(Delegate)

Concatena gli elenchi di chiamate del delegato multicast (combinabile) specificato e del delegato multicast (combinabile) corrente.

CreateDelegate(Type, MethodInfo)

Crea un delegato del tipo specificato per rappresentare il metodo specificato.

CreateDelegate(Type, MethodInfo, Boolean)

Crea un delegato del tipo specificato per rappresentare il metodo statico specificato, con il comportamento specificato in caso di errore di associazione.

CreateDelegate(Type, Object, MethodInfo)

Crea un delegato del tipo specificato che rappresenta il metodo statico o di istanza specificato, con il primo argomento specificato.

CreateDelegate(Type, Object, MethodInfo, Boolean)

Crea un delegato del tipo specificato che rappresenta il metodo statico o di istanza specificato, con il primo argomento specificato e il comportamento specificato in caso di errore di associazione.

CreateDelegate(Type, Object, String)

Crea un delegato del tipo specificato che rappresenta il metodo di istanza specificato da richiamare sull'istanza di classe specificata.

CreateDelegate(Type, Object, String, Boolean)

Crea un delegato del tipo specificato che rappresenta il metodo di istanza specificato da richiamare sull'istanza di classe specificata con la distinzione tra maiuscole e minuscole specificate.

CreateDelegate(Type, Object, String, Boolean, Boolean)

Crea un delegato del tipo specificato che rappresenta il metodo di istanza specificato da richiamare sull'istanza della classe specificata, con la distinzione tra maiuscole e minuscole e il comportamento specificato in caso di errore di associazione.

CreateDelegate(Type, Type, String)

Crea un delegato del tipo specificato che rappresenta il metodo statico specificato della classe specificata.

CreateDelegate(Type, Type, String, Boolean)

Crea un delegato del tipo specificato che rappresenta il metodo statico specificato della classe specificata, con la distinzione tra maiuscole e minuscole specificata.

CreateDelegate(Type, Type, String, Boolean, Boolean)

Crea un delegato del tipo specificato che rappresenta il metodo statico specificato della classe specificata, con la distinzione tra maiuscole e minuscole e il comportamento specificato in caso di errore di associazione.

DynamicInvoke(Object[])

Richiama in modo dinamico (con associazione tardiva) il metodo rappresentato dal delegato corrente.

DynamicInvokeImpl(Object[])

Richiama in modo dinamico (con associazione tardiva) il metodo rappresentato dal delegato corrente.

EnumerateInvocationList<TDelegate>(TDelegate)

Ottiene un enumeratore per le destinazioni di chiamata di questo delegato.

Equals(Object)

Determina se l'oggetto specificato e il delegato corrente sono dello stesso tipo e condividono le stesse destinazioni, metodi ed elenco chiamate.

GetHashCode()

Restituisce un codice hash per il delegato.

GetInvocationList()

Restituisce l'elenco chiamate del delegato.

GetMethodImpl()

Ottiene il metodo rappresentato dal delegato corrente.

GetObjectData(SerializationInfo, StreamingContext)
Obsoleti.

Non supportato.

GetType()

Ottiene il Type dell'istanza corrente.

(Ereditato da Object)
MemberwiseClone()

Crea una copia superficiale del Objectcorrente.

(Ereditato da Object)
Remove(Delegate, Delegate)

Rimuove l'ultima occorrenza dell'elenco chiamate di un delegato dall'elenco chiamate di un altro delegato.

RemoveAll(Delegate, Delegate)

Rimuove tutte le occorrenze dell'elenco chiamate di un delegato dall'elenco chiamate di un altro delegato.

RemoveImpl(Delegate)

Rimuove l'elenco chiamate di un delegato dall'elenco chiamate di un altro delegato.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Operatori

Equality(Delegate, Delegate)

Determina se i delegati specificati sono uguali.

Inequality(Delegate, Delegate)

Determina se i delegati specificati non sono uguali.

Metodi di estensione

GetMethodInfo(Delegate)

Ottiene un oggetto che rappresenta il metodo rappresentato dal delegato specificato.

Si applica a

Vedi anche