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
[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
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
type Delegate = class
[<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
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 Delegate classe è la classe base per i tipi delegati. Tuttavia, solo il sistema e i compilatori possono derivare in modo esplicito dalla Delegate classe o dalla MulticastDelegate classe . Non è inoltre consentito derivare un nuovo tipo da un tipo delegato. La Delegate classe non è considerata un tipo delegato. Si tratta di una classe usata per derivare i tipi delegati.

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

Note

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

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

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 CreateDelegate(Type, Object, MethodInfo, Boolean) metodo.

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 nascosto this nell'elenco dei parametri formali. In questo caso, il delegato non dispone di un riferimento a un oggetto di destinazione e deve essere fornito un oggetto di destinazione 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.

Note

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

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.

Note

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 aggiuntive sulle API per System.Delegate.CreateDelegate.

Costruttori

Nome Descrizione
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à

Nome Descrizione
Method

Ottiene il metodo rappresentato dal delegato.

Target

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

Metodi

Nome Descrizione
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.

CombineImpl(Delegate)

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

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, MethodInfo)

Crea un delegato del tipo specificato per rappresentare il metodo 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, MethodInfo)

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

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, 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)

Crea un delegato del tipo specificato che rappresenta il metodo di istanza specificato da richiamare sull'istanza di classe 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.

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)

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

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.

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)

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

Nome Descrizione
Equality(Delegate, Delegate)

Determina se i delegati specificati sono uguali.

Inequality(Delegate, Delegate)

Determina se i delegati specificati non sono uguali.

Metodi di estensione

Nome Descrizione
GetMethodInfo(Delegate)

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

Si applica a

Vedi anche