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 Delegate klasy lub z MulticastDelegate klasy. Nie można również utworzyć nowego typu z typu delegata. Klasa Delegate nie jest uważana za typ delegata; jest to klasa używana do uzyskiwania typów delegatów.

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

Uwaga

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

Środowisko uruchomieniowe języka wspólnego udostępnia każdemu typowi delegata metodom BeginInvoke i EndInvoke , aby umożliwić asynchroniczne wywołanie delegata. Aby uzyskać więcej informacji na temat tych metod, zobacz Asynchroniczne wywoływanie metod synchronicznych.

Deklaracja typu delegata ustanawia kontrakt, który określa podpis jednej lub kilku metod. Delegat jest wystąpieniem typu delegata, które zawiera odwołania do:

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

  • Metoda wystąpienia typu z ukrytym this parametrem 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 ramach pierwszego argumentu.

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

Gdy delegat reprezentuje metodę wystąpienia zamkniętą nad pierwszym argumentem (najczęściej spotykanym przypadkiem), delegat przechowuje odwołanie do punktu wejścia metody i odwołanie do obiektu, nazywanego obiektem docelowym, który jest typem przypisanym do typu, który zdefiniował metodę. Gdy delegat reprezentuje metodę otwartego wystąpienia, przechowuje odwołanie do punktu wejścia metody. Sygnatura delegata musi zawierać ukryty this parametr na liście parametrów formalnych. W tym przypadku delegat nie ma odwołania do obiektu docelowego, a obiekt docelowy musi zostać podany podczas wywoływanego delegata.

Gdy delegat reprezentuje metodę statyczną, delegat przechowuje odwołanie do punktu wejścia metody. Gdy delegat reprezentuje metodę statyczną zamkniętą nad pierwszym argumentem, 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órych 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 pojawiają się 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 zmieniaj istniejących delegatów. Zamiast tego taka operacja zwraca nowego delegata, który zawiera wyniki operacji, bez zmian delegata lub null. Operacja łączenia jest zwracana null , gdy wynikiem operacji jest delegat, który nie odwołuje się do co najmniej jednej metody. Operacja łączenia zwraca niezmieniony delegat, gdy żądana operacja nie ma wpływu.

Uwaga

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

Począwszy od .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 kowariancji i kontrawariancji.

Uwaga

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ą ostatniego elementu 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ą obiektowe i bezpieczne dla typów.

Przykłady można znaleźć w temacie Dodatkowe uwagi dotyczące interfejsu API dla elementu 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.

CombineImpl(Delegate)

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

CreateDelegate(Type, MethodInfo)

Tworzy delegat określonego typu do reprezentowania określonej metody.

CreateDelegate(Type, MethodInfo, Boolean)

Tworzy delegat określonego typu do reprezentowania określonej metody statycznej 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 po niepowiązaniu.

CreateDelegate(Type, Object, String)

Tworzy delegat określonego typu, który reprezentuje określoną metodę wystąpienia do wywołania na 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ą poufnoś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 na określonym wystąpieniu klasy, z określoną poufnoś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ą poufnoś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ą poufnością wielkości liter i określonym zachowaniem po niepowiązaniu.

DynamicInvoke(Object[])

Dynamicznie wywołuje (opóźnione) metodę reprezentowaną przez bieżącego delegata.

DynamicInvokeImpl(Object[])

Dynamicznie wywołuje (opóźnione) 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()

Type Pobiera bieżące wystąpienie.

(Odziedziczone po Object)
MemberwiseClone()

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

(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ż