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 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 BeginInvoke
EndInvoke
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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla