Sdílet prostřednictvím


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 třída používaná k odvození typů delegátů.

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

Poznámka

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

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

Deklarace typu delegáta vytvoří smlouvu, která určuje podpis jedné nebo více metod. Delegát je instance typu delegáta s odkazy na:

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

  • Metoda instance typu se skrytým parametrem this vystaveným v seznamu formálních parametrů. Delegát se označuje jako otevřený delegát instance.

  • Statická metoda.

  • Statická metoda a cílový objekt, které lze přiřadit prvnímu parametru metody. Delegát se říká, že je zavřený nad jeho prvním argumentem.

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

Když delegát představuje metodu instance uzavřenou nad prvním argumentem (nejběžnější případ), delegát uloží odkaz na vstupní bod metody a odkaz na objekt, který se nazývá cíl, což je typ přiřaditelný typu, který definoval metodu. Když delegát představuje metodu otevřené instance, uloží odkaz na vstupní bod metody. Podpis delegáta musí v seznamu formálních parametrů obsahovat skrytý parametr this; 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.

Pokud delegát představuje statickou metodu, delegát uloží odkaz na vstupní bod metody. Pokud delegát představuje statickou metodu uzavřenou nad prvním argumentem, delegát uloží odkaz na vstupní bod metody a odkaz na cílový objekt, který lze přiřadit k 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 referenční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 vyvolání může obsahovat duplicitní metody. Během vyvolání jsou metody vyvolány v pořadí, ve kterém se zobrazují v seznamu volání. Delegát se pokusí vyvolat každou metodu v seznamu volání; duplicity jsou vyvolány jednou pro každou dobu, kdy se zobrazí v seznamu vyvolání. Delegáti jsou neměnní; po vytvoření se seznam vyvolání delegáta nezmění.

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

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

Poznámka

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

Počínaje rozhraním .NET Framework 4 mohou obecné typy delegátů mít parametry variantního typu. Parametry kontravariantního typu lze použít jako typy parametrů delegáta a parametr kovariantního typu lze použít jako návratový typ. Tato funkce umožňuje obecné typy delegátů vytvořené ze stejné definice obecného typu, aby byly kompatibilní s přiřazením, pokud jsou jejich argumenty typu odkazy s vztahem dědičnosti, jak je vysvětleno v Kovariance a Kontravariance.

Poznámka

Obecné delegáty, které jsou kompatibilní s přiřazením kvůli rozptylu, nemusí být nutně kombinovány. Aby bylo možné kombinovat, musí se typy 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 kombinovat, protože typy přesně neodpovídají.

Pokud vyvolána 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í se nevyvolají. Zachycení výjimky v volajícím toto chování nemění.

Když podpis metod vyvolaných delegátem obsahuje návratovou hodnotu, delegát vrátí návratovou hodnotu posledního prvku v seznamu vyvolání. Pokud podpis obsahuje parametr předaný odkazem, konečná hodnota parametru je výsledkem každé metody v seznamu vyvolání, který se spouští postupně a aktualizuje hodnotu parametru.

Nejbližší ekvivalent delegáta v jazyce C je ukazatel funkce. Delegát může představovat statickou metodu nebo metodu instance. Pokud 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ů funkce jsou delegáti objektově orientované a typově bezpečné.

Příklady najdete v poznámky k doplňkovému rozhraní API pro System.Delegate.CreateDelegate.

Konstruktory

Delegate(Object, String)

Inicializuje delegáta, který vyvolá zadanou metodu 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 vyvolání dvou delegátů.

Combine(Delegate[])

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

Combine(ReadOnlySpan<Delegate>)

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

CombineImpl(Delegate)

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

CreateDelegate(Type, MethodInfo)

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

CreateDelegate(Type, MethodInfo, Boolean)

Vytvoří delegáta zadaného typu, který představuje zadanou statickou metodu se zadaným chováním při selhání vytvoření vazby.

CreateDelegate(Type, Object, MethodInfo)

Vytvoří delegát 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át 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í vytvoření vazby.

CreateDelegate(Type, Object, String)

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

CreateDelegate(Type, Object, String, Boolean)

Vytvoří delegát zadaného typu, který představuje zadanou metodu instance, která se vyvolá na zadanou instanci třídy se zadanou citlivostí na velká a malá písmena.

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

Vytvoří delegát zadaného typu, který představuje zadanou metodu instance k vyvolání na zadané instanci třídy, se zadanou citlivostí a zadaným chováním 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 citlivostí na velká a malá písmena.

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

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

DynamicInvoke(Object[])

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

DynamicInvokeImpl(Object[])

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

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 vyvolání.

GetHashCode()

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

GetInvocationList()

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

GetMethodImpl()

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

GetObjectData(SerializationInfo, StreamingContext)
Zastaralé.

Nepodporuje se.

GetType()

Získá Type aktuální instance.

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

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

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

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

RemoveAll(Delegate, Delegate)

Odebere všechny výskyty seznamu vyvolá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 zadaná delegáti rovna.

Inequality(Delegate, Delegate)

Určuje, zda se zadaná delegáta nerovnají.

Metody rozšíření

GetMethodInfo(Delegate)

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

Platí pro

Viz také