Udostępnij za pośrednictwem


Delegate Klasa

Definicja

Reprezentuje delegata, który jest strukturą danych odwołującą 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ż uzyskać 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 delegate słowo kluczowe, a kompilatory dla tych języków są w stanie pochodzić z MulticastDelegate klasy, dlatego użytkownicy powinni użyć 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 jest przydatna Invoke w odbiciu , gdy chcesz znaleźć podpis typu delegata.

Środowisko uruchomieniowe języka wspólnego udostępnia każdemu typowi delegata i BeginInvokeEndInvoke metodom, 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 co najmniej jednej metody. Delegat to wystąpienie typu delegata, które ma odwołania do:

  • Metoda wystąpienia typu i obiektu docelowego można przypisać do tego typu.

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

  • Metoda statyczna.

  • Metoda statyczna i obiekt docelowy można przypisać do pierwszego parametru metody. Delegat mówi się, że zostanie zamknięty w ramach swojego 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ęstszym przypadkiem), delegat przechowuje odwołanie do punktu wejścia metody i odwołanie do obiektu, nazywanego obiektem docelowym, który jest typem przypisywanym do typu zdefiniowanego przez 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 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ą 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 to uporządkowany zestaw 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ę.

Delegaci są nazywani multiemisji lub łączeniem, ponieważ delegat może wywoływać co najmniej jedną 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 nowy delegat, który zawiera wyniki operacji, bez zmian delegata lub null. Operacja łączenia zwraca się null , gdy wynik operacji jest delegatem, który nie odwołuje się do co najmniej jednej metody. Operacja łączenia zwraca niezmienionego delegata, 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 -= na typach delegatów w języku C#.

Począwszy od programu .NET Framework 4, ogólne typy delegatów mogą mieć parametry typu wariantu. Parametry typu contravariant mogą być używane jako typy parametrów delegata, a kowariantny parametr typu może być używany 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 artykule Covariance i Contravariance.

Uwaga

Ogólne delegaty zgodne z przypisaniem ze względu na wariancję nie muszą być połączone. Aby można 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 przestaje działać, 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. Przechwytywanie 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, ostateczną wartością parametru jest każda metoda na liście wywołań wykonująca sekwencyjnie i aktualizując wartość 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ą zorientowane obiektowo i bezpieczne.

Aby zapoznać się z przykładami, zobacz Uwagi dotyczące dodatkowego 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 odwołującą 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 odwołującą 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żliwe do połączenia) i bieżącego delegata multiemisji (możliwe do połączenia).

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 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, która ma być wywoływana w określonym wystąpieniu klasy z określoną wrażliwością wielkości liter.

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

Tworzy delegat określonego typu, który reprezentuje określoną metodę wystąpienia, która ma być wywoływana w określonym wystąpieniu klasy, z określonym uwzględnieniem 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ą wrażliwoś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ą wrażliwością wielkości liter i określonym zachowaniem w przypadku niepowodzenia powiązania.

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 odwołującą 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ż