Udostępnij za pośrednictwem


Delegate Klasa

Definicja

Reprezentuje delegata, który jest strukturą danych, która odwołuje się do metody statycznej lub wystąpienia klasy i metody wystąpienia tej klasy.

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
Dziedziczenie
Delegate
Pochodne
Atrybuty
Implementuje

Uwagi

Klasa Delegate jest klasą bazową dla typów delegatów. Jednak tylko system i kompilatory mogą pochodzić jawnie z klasy Delegate lub z klasy MulticastDelegate. Nie można również utworzyć nowego typu z typu delegata. Klasa Delegate nie jest traktowana jako typ delegata; jest to klasa używana do uzyskiwania typów delegatów.

Większość języków implementuje słowo kluczowe delegate, a kompilatory dla tych języków są w stanie pochodzić z klasy MulticastDelegate; dlatego użytkownicy powinni używać słowa kluczowego delegate dostarczonego przez język.

Nuta

Środowisko uruchomieniowe języka wspólnego udostępnia metodę Invoke dla każdego typu delegata z tym samym podpisem co delegat. Nie musisz jawnie wywoływać tej metody z języków C#, Visual Basic lub Visual C++, ponieważ kompilatory nazywają ją automatycznie. Metoda Invoke jest przydatna w odbicia, gdy chcesz znaleźć podpis typu delegata.

Środowisko uruchomieniowe języka wspólnego udostępnia każdy typ delegata z metodami BeginInvoke i EndInvoke, aby umożliwić asynchroniczne wywołanie delegata. Aby uzyskać więcej informacji na temat tych metod, zobacz Wywoływanie metod synchronicznych asynchronicznie.

Deklaracja typu delegata ustanawia kontrakt określający podpis jednej lub większej liczby metod. Delegat to wystąpienie typu delegata, które ma odwołania do:

  • Metoda wystąpienia typu i obiekt docelowy można przypisać do tego typu.

  • Metoda wystąpienia typu z ukrytym parametrem this uwidoczniony na liście parametrów formalnych. Delegat jest mówi się, że jest delegatem otwartego wystąpienia.

  • Metoda statyczna.

  • Metoda statyczna i obiekt docelowy można przypisać do pierwszego parametru metody. Mówi się, że delegat zostanie zamknięty w pierwszej kłótni.

Aby uzyskać więcej informacji na temat powiązania delegata, zobacz przeciążenie metody CreateDelegate(Type, Object, MethodInfo, Boolean).

Gdy delegat reprezentuje metodę wystąpienia zamkniętą w pierwszym argumencie (najczęstszy przypadek), delegat przechowuje odwołanie do punktu wejścia metody i odwołanie do obiektu, nazywanego obiektem docelowym, który jest typu przypisywany do typu zdefiniowanego przez metodę. Gdy delegat reprezentuje metodę otwartego wystąpienia, przechowuje odwołanie do punktu wejścia metody. Podpis delegata musi zawierać ukryty parametr this na liście parametrów formalnych; w tym przypadku delegat nie ma odwołania do obiektu docelowego, a obiekt docelowy musi zostać podany po wywołaniu delegata.

Gdy delegat reprezentuje metodę statyczną, delegat przechowuje odwołanie do punktu wejścia metody. Gdy delegat reprezentuje metodę statyczną zamkniętą w pierwszym argumencie, delegat przechowuje odwołanie do punktu wejścia metody i odwołanie do obiektu docelowego, który można przypisać do typu pierwszego argumentu metody. Po wywołaniu delegata pierwszy argument metody statycznej odbiera obiekt docelowy. Ten pierwszy argument musi być typem odwołania.

Lista wywołań delegata jest uporządkowanym zestawem delegatów, w którym każdy element listy wywołuje dokładnie jedną z metod reprezentowanych przez delegata. Lista wywołań może zawierać zduplikowane metody. Podczas wywołania metody są wywoływane w kolejności, w której są wyświetlane na liście wywołań. Delegat próbuje wywołać każdą metodę na liście wywołań; duplikaty są wywoływane raz za każdym razem, gdy pojawiają się na liście wywołań. Delegaci są niezmienni; po utworzeniu lista wywołań delegata nie zmienia się.

Delegaty są określane jako multiemisji lub łączenia, ponieważ delegat może wywołać jedną lub więcej metod i może służyć do łączenia operacji.

Łączenie operacji, takich jak Combine i Remove, nie zmienia istniejących delegatów. Zamiast tego taka operacja zwraca nowego delegata, który zawiera wyniki operacji, niezmienionego delegata lub null. Operacja łączenia zwraca null, gdy wynik operacji jest delegatem, który nie odwołuje się do co najmniej jednej metody. Operacja łączenia zwraca niezmieniony delegat, gdy żądana operacja nie ma żadnego wpływu.

Nuta

Języki zarządzane używają metod Combine i Remove do implementowania operacji delegowanych. Przykłady obejmują instrukcje AddHandler i RemoveHandler w języku Visual Basic oraz operatory += i -= w typach delegatów w języku C#.

Począwszy od programu .NET Framework 4, typy delegatów ogólnych mogą mieć parametry typu wariantu. Kontrawariantne parametry typu mogą być używane jako typy parametrów delegata, a kowariantny parametr typu może służyć jako typ zwracany. Ta funkcja umożliwia ogólne typy delegatów, które są konstruowane z tej samej definicji typu ogólnego, aby były zgodne z przypisaniem, jeśli ich argumenty typu są typami referencyjnymi z relacją dziedziczenia, jak wyjaśniono w Kowariancja i Kontrawariancja.

Nuta

Delegaty ogólne, które są zgodne z przypisaniem ze względu na wariancję, nie muszą być połączone. Aby można je było połączyć, typy muszą być dokładnie zgodne. Załóżmy na przykład, że klasa o nazwie Derived pochodzi z klasy o nazwie Base. Delegat typu Action<Base> (Action(Of Base) w Visual Basic) można przypisać do zmiennej typu Action<Derived>, ale nie można połączyć dwóch delegatów, ponieważ typy nie są dokładnie zgodne.

Jeśli wywołana metoda zgłasza wyjątek, metoda zatrzymuje wykonywanie, wyjątek jest przekazywany z powrotem do obiektu wywołującego delegata, a pozostałe metody na liście wywołań nie są wywoływane. Przechwycenie wyjątku w obiekcie wywołującym nie zmienia tego zachowania.

Gdy podpis metod wywoływanych przez delegata zawiera wartość zwracaną, delegat zwraca wartość zwracaną przez ostatni element na liście wywołań. Gdy podpis zawiera parametr przekazywany przez odwołanie, końcowa wartość parametru jest wynikiem każdej metody na liście wywołań wykonywanych sekwencyjnie i aktualizowaniu wartości parametru.

Najbliższym odpowiednikiem delegata w języku C jest wskaźnik funkcji. Delegat może reprezentować metodę statyczną lub metodę wystąpienia. Gdy delegat reprezentuje metodę wystąpienia, delegat przechowuje nie tylko odwołanie do punktu wejścia metody, ale także odwołanie do wystąpienia klasy. W przeciwieństwie do wskaźników funkcji delegaty są obiektami zorientowanymi i bezpiecznymi typami.

Aby zapoznać się z przykładami, zobacz uwagi dotyczące interfejsu API uzupełniającego system.Delegate.CreateDelegate.

Konstruktory

Delegate(Object, String)

Inicjuje delegata, który wywołuje określoną metodę wystąpienia w określonym wystąpieniu klasy.

Delegate(Type, String)

Inicjuje delegata, który wywołuje określoną metodę statyczną z określonej klasy.

Właściwości

HasSingleTarget

Reprezentuje delegata, który jest strukturą danych, która odwołuje się do metody statycznej lub wystąpienia klasy i metody wystąpienia tej klasy.

Method

Pobiera metodę reprezentowaną przez delegata.

Target

Pobiera wystąpienie klasy, na którym bieżący delegat wywołuje metodę wystąpienia.

Metody

Clone()

Tworzy płytkią kopię delegata.

Combine(Delegate, Delegate)

Łączy listy wywołań dwóch delegatów.

Combine(Delegate[])

Łączy listy wywołań tablicy delegatów.

Combine(ReadOnlySpan<Delegate>)

Reprezentuje delegata, który jest strukturą danych, która odwołuje się do metody statycznej lub wystąpienia klasy i metody wystąpienia tej klasy.

CombineImpl(Delegate)

Łączy listy wywołań określonego delegata multiemisji (można połączyć) i bieżącego delegata multiemisji (można połączyć).

CreateDelegate(Type, MethodInfo)

Tworzy delegat określonego typu, aby reprezentować określoną metodę.

CreateDelegate(Type, MethodInfo, Boolean)

Tworzy delegat określonego typu, aby reprezentować określoną metodę statyczną z określonym zachowaniem w przypadku niepowodzenia powiązania.

CreateDelegate(Type, Object, MethodInfo)

Tworzy delegat określonego typu, który reprezentuje określoną metodę statyczną lub wystąpienie z określonym pierwszym argumentem.

CreateDelegate(Type, Object, MethodInfo, Boolean)

Tworzy delegat określonego typu, który reprezentuje określoną metodę statyczną lub wystąpienie z określonym pierwszym argumentem i określonym zachowaniem w przypadku niepowodzenia powiązania.

CreateDelegate(Type, Object, String)

Tworzy delegat określonego typu, który reprezentuje określoną metodę wystąpienia do wywołania w określonym wystąpieniu klasy.

CreateDelegate(Type, Object, String, Boolean)

Tworzy delegat określonego typu, który reprezentuje określoną metodę wystąpienia do wywołania w określonym wystąpieniu klasy z określoną czułością wielkości liter.

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

Tworzy delegat określonego typu, który reprezentuje określoną metodę wystąpienia do wywołania w określonym wystąpieniu klasy, z określoną czułością wielkości liter i określonym zachowaniem w przypadku niepowodzenia powiązania.

CreateDelegate(Type, Type, String)

Tworzy delegat określonego typu, który reprezentuje określoną metodę statyczną określonej klasy.

CreateDelegate(Type, Type, String, Boolean)

Tworzy delegat określonego typu, który reprezentuje określoną metodę statyczną określonej klasy z określoną czułością wielkości liter.

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

Tworzy delegat określonego typu, który reprezentuje określoną metodę statyczną określonej klasy, z określoną czułością wielkości liter i określonym zachowaniem w przypadku niepowodzenia powiązania.

DynamicInvoke(Object[])

Dynamicznie wywołuje (późną granicę) metodę reprezentowaną przez bieżącego delegata.

DynamicInvokeImpl(Object[])

Dynamicznie wywołuje (późną granicę) metodę reprezentowaną przez bieżącego delegata.

EnumerateInvocationList<TDelegate>(TDelegate)

Reprezentuje delegata, który jest strukturą danych, która odwołuje się do metody statycznej lub wystąpienia klasy i metody wystąpienia tej klasy.

Equals(Object)

Określa, czy określony obiekt i bieżący delegat mają ten sam typ i współużytkują te same obiekty docelowe, metody i listę wywołań.

GetHashCode()

Zwraca kod skrótu dla delegata.

GetInvocationList()

Zwraca listę wywołań delegata.

GetMethodImpl()

Pobiera metodę reprezentowaną przez bieżącego delegata.

GetObjectData(SerializationInfo, StreamingContext)
Przestarzałe.

Nieobsługiwane.

GetType()

Pobiera Type bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Object.

(Odziedziczone po Object)
Remove(Delegate, Delegate)

Usuwa ostatnie wystąpienie listy wywołań delegata z listy wywołań innego delegata.

RemoveAll(Delegate, Delegate)

Usuwa wszystkie wystąpienia listy wywołań delegata z listy wywołań innego delegata.

RemoveImpl(Delegate)

Usuwa listę wywołań delegata z listy wywołań innego delegata.

ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Operatory

Equality(Delegate, Delegate)

Określa, czy określone delegaty są równe.

Inequality(Delegate, Delegate)

Określa, czy określone delegaty nie są równe.

Metody rozszerzania

GetMethodInfo(Delegate)

Pobiera obiekt reprezentujący metodę reprezentowaną przez określonego delegata.

Dotyczy

Zobacz też