Delegate Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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 |
Pobiera wartość wskazującą, czy Delegate ma jeden element docelowy wywołania. |
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>) |
Łączy listy wywołań zakresu delegatów. |
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) |
Pobiera moduł wyliczający dla celów wywołania tego delegata. |
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. |