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 odvozovat 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 jsou schopny odvodit z MulticastDelegate třídy, proto by uživatelé měli používat 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 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á při reflexi , když chcete najít podpis typu delegáta.

Modul CLR (Common Language Runtime) poskytuje každý typ 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 vytvoří 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. O delegátu se říká, že je zavřený kvůli prvnímu argumentu.

Další informace o vazbě delegáta najdete v CreateDelegate(Type, Object, MethodInfo, Boolean) tématu 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 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 přiřaditelný k typu prvního argumentu metody. Při vyvolání delegáta první argument statické metody obdrží 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é 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 pokaždé, 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 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í se 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í delegáta. 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 obecné typy delegátů obsahovat parametry variantního typu. Parametry kontravariantního typu lze použít jako typy parametrů delegáta a jako návratový typ lze použít kovariantní parametr typu. Tato funkce umožňuje, aby obecné typy delegátů vytvořené 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 části Covariance a Contravariance.

Poznámka

Obecné delegáty, které jsou kvůli rozptylu 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 odvozená od třídy s názvem Base. Delegát typu Action<Base> (Action(Of Base) v jazyce Visual Basic) lze přiřadit k proměnné typu Action<Derived>, ale oba delegáty nelze kombinovat, protože typy se 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í se nevyvolají. Zachycení výjimky v volajícím toto chování nezmění.

Pokud podpis metod vyvolaných delegátem obsahuje návratovou hodnotu, vrátí delegá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 každé metody v seznamu volání, která se postupně provádí a aktualizuje hodnotu parametru.

Nejbližším ekvivalentem delegáta v jazyce C je ukazatel funkce. 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áti objektově orientované a typ bezpečný.

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

Konstruktory

Delegate(Object, String)

Inicializuje delegáta, který vyvolá metodu zadané instance na 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 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 volá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á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á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á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át zadaného typu, který představuje zadanou metodu instance, která se má vyvolat v zadané instanci třídy.

CreateDelegate(Type, Object, String, Boolean)

Vytvoří delegát zadaného typu, který představuje zadanou metodu instance vyvolat na 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, která se má vyvolat 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 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é.

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 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 si zadané delegáty rovny.

Inequality(Delegate, Delegate)

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

Metody rozšíření

GetMethodInfo(Delegate)

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

Platí pro

Viz také