Delegate Třída

Definice

Představuje delegáta, což je datová struktura, která odkazuje na statickou metodu nebo instanci třídy a metodu instance této třídy.

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
Dědičnost
Delegate
Odvozené
Atributy
Implementuje

Poznámky

Třída Delegate je základní třídou pro typy delegátů. Pouze systém a kompilátory však mohou být odvozeny explicitně z Delegate třídy nebo z MulticastDelegate třídy . Není také možné odvodit nový typ z typu delegáta. Třída Delegate není považována za typ delegáta; je to třída používaná k odvození typů delegátů.

Většina jazyků implementuje delegate klíčové slovo a kompilátory pro tyto jazyky mohou odvodit z MulticastDelegate třídy , proto by uživatelé měli použít delegate klíčové slovo poskytované jazykem.

Poznámka

Modul CLR (Common Language Runtime) poskytuje metodu Invoke pro každý typ delegáta se stejným podpisem jako delegát. Tuto metodu není nutné volat explicitně z jazyka C#, Visual Basic nebo Visual C++, protože kompilátory ji volají automaticky. Metoda Invoke je užitečná při reflexi , když chcete najít podpis typu delegáta.

Modul CLR (Common Language Runtime) poskytuje každému typu delegáta s metodami BeginInvoke a EndInvoke , které umožňují asynchronní vyvolání delegáta. Další informace o těchto metodách najdete v tématu Asynchronní volání synchronních metod.

Deklarace typu delegáta vytváří kontrakt, který určuje podpis jedné nebo více metod. Delegát je instance typu delegáta, který obsahuje odkazy na:

  • Metoda instance typu a cílový objekt, který lze přiřadit k danému typu.

  • Metoda instance typu se skrytým this parametrem vystaveným v seznamu formálních parametrů. O delegátu se říká, že je to delegát otevřené instance.

  • Statická metoda.

  • Statická metoda a cílový objekt, které lze přiřadit prvnímu parametru metody. Delegát je údajně zavřený kvůli prvnímu argumentu.

Další informace o vazbě delegáta najdete v CreateDelegate(Type, Object, MethodInfo, Boolean) přetížení metody.

Když delegát představuje metodu instance uzavřenou přes svůj první argument (nejběžnější případ), delegát uloží odkaz na vstupní bod metody a odkaz na objekt, označovaný jako cíl, který je typu přiřaditelného k typu, který definoval metodu. Když delegát představuje metodu otevřené instance, uloží odkaz na vstupní bod metody. Podpis delegáta musí obsahovat skrytý this parametr ve svém formálním seznamu parametrů. V tomto případě delegát nemá odkaz na cílový objekt a cílový objekt musí být zadán při vyvolání delegáta.

Když delegát představuje statickou metodu, delegát uloží odkaz na vstupní bod metody. Když delegát představuje statickou metodu uzavřenou nad jejím prvním argumentem, delegát uloží odkaz na vstupní bod metody a odkaz na cílový objekt, který lze přiřadit typu prvního argumentu metody. Při vyvolání delegáta obdrží první argument statické metody cílový objekt. Tento první argument musí být odkazovým typem.

Seznam vyvolání delegáta je uspořádaná sada delegátů, ve kterých každý prvek seznamu vyvolá přesně jednu z metod reprezentovaných delegátem. Seznam volání může obsahovat duplicitní metody. Během volání jsou metody vyvolány v pořadí, ve kterém se zobrazují v seznamu volání. Delegát se pokusí vyvolat všechny metody v seznamu vyvolání; duplicity jsou vyvolány jednou pro pokaždé, když se zobrazí v seznamu volání. Delegáti jsou neměnní; po vytvoření se seznam volání delegáta nezmění.

Delegáti se označují jako vícesměrové vysílání nebo kombinovatelné, protože delegát může vyvolat jednu nebo více metod a lze je použít při kombinování operací.

Kombinováním operací, jako Combine jsou a Remove, se stávající delegáty nemění. Místo toho taková operace vrátí nového delegáta, který obsahuje výsledky operace, nezměněného delegáta nebo null. Operace kombinování vrátí null , pokud je výsledkem operace delegát, který neodkazuje alespoň na jednu metodu. Operace kombinování vrátí nezměněného delegáta, pokud požadovaná operace nemá žádný vliv.

Poznámka

Spravované jazyky používají Combine metody a Remove k implementaci operací delegování. Mezi příklady patří AddHandler příkazy a RemoveHandler v jazyce Visual Basic a operátory += a -= u typů delegátů v jazyce C#.

Počínaje rozhraním .NET Framework 4 můžou mít obecné typy delegátů parametry variantního typu. Parametry kontravariantního typu lze použít jako typy parametrů delegátu a parametr kovariantního typu lze použít jako návratový typ. Tato funkce umožňuje, aby obecné typy delegátů, které jsou vytvořeny ze stejné definice obecného typu, byly kompatibilní s přiřazením, pokud jejich argumenty typu jsou odkazovými typy s vztahem dědičnosti, jak je vysvětleno v článku o kovarianci a kontravarianci.

Poznámka

Obecné delegáty, které jsou z důvodu odchylky kompatibilní s přiřazením, nemusí být nutně kombinovatelné. Aby bylo možné tyto typy kombinovat, musí se přesně shodovat. Předpokládejme například, že třída s názvem Derived je odvozena z třídy s názvem Base. Delegát typu Action<Base> (Action(Of Base) v jazyce Visual Basic) lze přiřadit proměnné typu Action<Derived>, ale tyto dva delegáty nelze zkombinovat, protože se typy přesně neshodují.

Pokud vyvoláná metoda vyvolá výjimku, metoda se zastaví, výjimka se předá zpět volajícímu delegáta a zbývající metody v seznamu volání nebudou vyvolány. Zachycení výjimky v volajícím nezmění toto chování.

Pokud podpis metod vyvolaných delegátem obsahuje návratovou hodnotu, delegát vrátí návratovou hodnotu posledního prvku v seznamu volání. Pokud podpis obsahuje parametr, který je předán odkazem, konečná hodnota parametru je výsledkem toho, že každá metoda v seznamu volání provádí postupně a aktualizuje hodnotu parametru.

Nejbližší ekvivalent delegáta v jazyce C je ukazatel na funkci. Delegát může představovat statickou metodu nebo metodu instance. Když delegát představuje metodu instance, delegát ukládá nejen odkaz na vstupní bod metody, ale také odkaz na instanci třídy. Na rozdíl od ukazatelů na funkce jsou delegáty objektově orientované a typově bezpečné.

Příklady najdete v tématu Doplňkové poznámky rozhraní API pro System.Delegate.CreateDelegate.

Konstruktory

Delegate(Object, String)

Inicializuje delegáta, který vyvolá metodu zadané instance v zadané instanci třídy.

Delegate(Type, String)

Inicializuje delegáta, který vyvolá zadanou statickou metodu ze zadané třídy.

Vlastnosti

HasSingleTarget

Představuje delegáta, což je datová struktura, která odkazuje na statickou metodu nebo instanci třídy a metodu instance této třídy.

Method

Získá metodu reprezentovanou delegátem.

Target

Získá instanci třídy, na které aktuální delegát vyvolá metodu instance.

Metody

Clone()

Vytvoří mělkou kopii delegáta.

Combine(Delegate, Delegate)

Zřetězí seznamy volání dvou delegátů.

Combine(Delegate[])

Zřetězí seznamy volání pole delegátů.

CombineImpl(Delegate)

Zřetězí seznamy volání zadaného delegáta vícesměrového vysílání (kombinovatelného) a aktuálního vícesměrového (kombinovatelného) delegáta.

CreateDelegate(Type, MethodInfo)

Vytvoří delegáta zadaného typu, který bude představovat zadanou metodu.

CreateDelegate(Type, MethodInfo, Boolean)

Vytvoří delegát zadaného typu představující zadanou statickou metodu se zadaným chováním při selhání vazby.

CreateDelegate(Type, Object, MethodInfo)

Vytvoří delegáta zadaného typu, který představuje zadanou statickou metodu nebo metodu instance se zadaným prvním argumentem.

CreateDelegate(Type, Object, MethodInfo, Boolean)

Vytvoří delegáta zadaného typu, který představuje zadanou statickou metodu nebo metodu instance se zadaným prvním argumentem a zadaným chováním při selhání vazby.

CreateDelegate(Type, Object, String)

Vytvoří delegáta zadaného typu, který představuje zadanou metodu instance k vyvolání na instanci zadané třídy.

CreateDelegate(Type, Object, String, Boolean)

Vytvoří delegáta zadaného typu, který představuje zadanou metodu instance k vyvolání v zadané instanci třídy se zadanou rozlišováním malých a malých písmen.

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

Vytvoří delegát zadaného typu, který představuje zadanou metodu instance k vyvolání v zadané instanci třídy se zadanou rozlišováním malých a malých písmen a zadané chování při selhání vazby.

CreateDelegate(Type, Type, String)

Vytvoří delegát zadaného typu, který představuje zadanou statickou metodu zadané třídy.

CreateDelegate(Type, Type, String, Boolean)

Vytvoří delegát zadaného typu, který představuje zadanou statickou metodu zadané třídy se zadanou rozlišováním velkých a malých písmen.

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

Vytvoří delegát zadaného typu, který představuje zadanou statickou metodu zadané třídy se zadanou rozlišováním malých a malých písmen a zadané chování při selhání vazby.

DynamicInvoke(Object[])

Dynamicky vyvolá (s pozdní vazbou) metodu reprezentovanou aktuálním delegátem.

DynamicInvokeImpl(Object[])

Dynamicky vyvolá (s pozdní vazbou) metodu reprezentovanou aktuálním delegátem.

EnumerateInvocationList<TDelegate>(TDelegate)

Představuje delegáta, což je datová struktura, která odkazuje na statickou metodu nebo instanci třídy a metodu instance této třídy.

Equals(Object)

Určuje, zda zadaný objekt a aktuální delegát jsou stejného typu a sdílejí stejné cíle, metody a seznam volání.

GetHashCode()

Vrátí kód hash delegáta.

GetInvocationList()

Vrátí seznam volání delegáta.

GetMethodImpl()

Získá metodu reprezentovanou aktuálním delegátem.

GetObjectData(SerializationInfo, StreamingContext)
Zastaralé.

Nepodporováno

GetType()

Type Získá z aktuální instance.

(Zděděno od Object)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
Remove(Delegate, Delegate)

Odebere poslední výskyt seznamu volání delegáta ze seznamu vyvolání jiného delegáta.

RemoveAll(Delegate, Delegate)

Odebere všechny výskyty seznamu volání delegáta ze seznamu vyvolání jiného delegáta.

RemoveImpl(Delegate)

Odebere seznam vyvolání delegáta ze seznamu vyvolání jiného delegáta.

ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Operátory

Equality(Delegate, Delegate)

Určuje, zda jsou si zadané delegáty rovny.

Inequality(Delegate, Delegate)

Určuje, zda jsou si zadané delegáty rovny.

Metody rozšíření

GetMethodInfo(Delegate)

Získá objekt, který představuje metodu reprezentovanou zadaným delegátem.

Platí pro

Viz také