Udostępnij za pośrednictwem


Za pomocą delegatów (Podręcznik programowania C#)

A delegować jest typem bezpiecznie hermetyzuje metody, podobne do wskaźnika funkcji w c i C++.W przeciwieństwie do wskaźników funkcji c delegaci są zorientowane obiektowo, wpisz bezpieczne i bezpieczne.Typ delegata jest zdefiniowany przez nazwę pełnomocnika.Poniższy przykład deklaruje pełnomocnika, o nazwie Del , można upakować metody, która przyjmuje string jako argument i zwraca void:

public delegate void Del(string message);

Obiekt delegata zwykle wykonane przez zapewniające nazwę metody pełnomocnik będzie zawijany, lub z metody anonimowej.Po utworzeniu obiektu delegowanego wywołanie metody do pełnomocnika zostaną przekazane przez pełnomocnika do tej metody.Parametry przekazane do obiektu delegowanego przez obiekt wywołujący są przekazywane do metody i zwracanej wartości, jeśli takie są, z metody jest zwróconych przez pełnomocnika.Jest to nazywane wywoływanie pełnomocnika.Może być wywoływana skonkretyzowanym pełnomocnika, tak jakby był on zawinięty samą metodę.Na przykład:

// Create a method for a delegate.
public static void DelegateMethod(string message)
{
    System.Console.WriteLine(message);
}
// Instantiate the delegate.
Del handler = DelegateMethod;

// Call the delegate.
handler("Hello World");

Są pochodnymi typów obiektów delegowanych Delegate klasy w.NET Framework.Typy obiektu delegowanego zamkniętych— nie może zostać wyprowadzony z — i nie jest możliwe określenie niestandardowych klas z Delegate.Ponieważ skonkretyzowanym delegata jest obiekt, to mogą być przekazane jako parametr lub przypisać właściwości.Umożliwia to metoda delegata jako parametr akceptuje i wywołać pełnomocnik nieco później.To jest znany jako asynchroniczna i jest wspólnej metody powiadamianie wywołujący długi proces został zakończony.Gdy pełnomocnik jest używany w ten sposób, kod, za pomocą pełnomocnik nie ma potrzeby wszelkich wiedzy wykonania stosowana metoda.Funkcje są podobne do hermetyzacji, które zapewniają interfejsy.Aby uzyskać więcej informacji, zobacz podczas do użytku delegatów zamiast interfejsów.

Innym typowym zastosowaniem wywołania zwrotne jest zdefiniowanie metody niestandardowe porównanie i przekazując to pełnomocnik metody sortowania.Umożliwia on kodu wywołującego stają się częścią algorytm sortowania.Następujący przykład metody używa Del typu jako parametr:

public void MethodWithCallback(int param1, int param2, Del callback)
{
    callback("The number is: " + (param1 + param2).ToString());
}

Następnie można przekazać obiektu delegowanego utworzonego powyżej tej metody:

MethodWithCallback(1, 2, handler);

i otrzymują następujące dane wyjściowe do konsoli:

The number is: 3

Za pomocą pełnomocnik jako abstrakcji MethodWithCallback nie trzeba wywołać konsolę bezpośrednio — nie musi być zaprojektowane z konsoli na uwadze.Co MethodWithCallback jest to po prostu przygotować ciąg i przekazuje ciąg do innej metody.Jest to szczególnie wydajne, ponieważ metoda delegowane można użyć dowolnej liczby parametrów.

Gdy pełnomocnik jest skonstruowany do zawijania metody instancji, pełnomocnik odwołuje się zarówno w instancji, jak i metoda.Pełnomocnik nie ma informacji typu instancji od metody, którą on zawijany, tak jak długo istnieje metoda dla tego obiektu, który nie pasuje do podpisu delegata pełnomocnik może odnosić się do dowolnego typu obiektu.Gdy pełnomocnik jest skonstruowany do zawijania metody statyczne, jedynie odniesienia metody.Należy wziąć pod uwagę następujące deklaracje:

public class MethodClass
{
    public void Method1(string message) { }
    public void Method2(string message) { }
}

Wraz z statycznego DelegateMethod pokazanym wcześniej, mamy teraz trzy metody, które można zawijać za pomocą Del instancji.

Pełnomocnik może wywołać więcej niż jedna metoda przy wywołaniu.To jest określone jako multiemisja.Aby dodać dodatkowe metody do listy pełnomocnika metod — lista wywołania — po prostu wymaga dodanie dwóch delegatów przy użyciu dodatku lub dodanie operatory przypisania ("+" lub "+=").Na przykład:

MethodClass obj = new MethodClass();
Del d1 = obj.Method1;
Del d2 = obj.Method2;
Del d3 = DelegateMethod;

//Both types of assignment are valid.
Del allMethodsDelegate = d1 + d2;
allMethodsDelegate += d3;

W tym momencie allMethodsDelegate zawiera trzy metody na swojej liście wywołania —Method1, Method2, i DelegateMethod.Oryginalny trzech delegatów, d1, d2, i d3, pozostają niezmienione.Gdy allMethodsDelegate jest wywoływana, wszystkie trzy metody są nazywane w kolejności.Jeżeli pełnomocnik używa parametrów odniesienia, odwołanie jest przekazywana kolejno do każdego z trzech metod z kolei, a wszelkie zmiany wprowadzane przez jedną z metod są widoczne dla następnej metody.Kiedy dowolnej z metod generuje wyjątek, który nie jest złowionych w metodzie, że wyjątek jest przekazywany do wywołującego delegata i żadne metody kolejne wywołania na liście są nazywane.Jeśli pełnomocnik ma zwracanej wartości i/lub parametrów, zwraca zwracanej wartości i parametry ostatnia metoda wywoływana.Aby usunąć metodę z listy wywołania, użyj osłabienie lub dekrementacja operatorem przypisania ('-' lub ' '-='').Na przykład:

//remove Method1
allMethodsDelegate -= d1;

// copy AllMethodsDelegate while removing d2
Del oneMethodDelegate = allMethodsDelegate - d2;

Ponieważ są pochodnymi typów obiektów delegowanych System.Delegate, metod i właściwości definiowanych przez tę klasę można wywołać obiektu delegowanego.Na przykład aby znaleźć liczbę metod liście wywołania obiektu delegowanego, można wpisywać:

int invocationCount = d1.GetInvocationList().GetLength(0);

Delegaci z więcej niż jednej metody ich liście wywołania pochodzić od MulticastDelegate, który jest podklasą System.Delegate.Powyższy kod działa w każdym przypadku, ponieważ obsługuje zarówno klas GetInvocationList.

Pełnomocnicy multiemisji są szeroko stosowane w obsłudze zdarzeń.Obiekty źródła zdarzeń wysyłania powiadomień o zdarzeniach do adresatów obiektów, które zostały zarejestrowane w celu odbierania zdarzenia.Zarejestrować zdarzenie, odbiorca tworzy metody przeznaczone do obsługi zdarzeń, a następnie tworzy delegata tej metody i przekazuje delegatowi do źródła zdarzeń.Źródło wywołuje pełnomocnika, po wystąpieniu zdarzenia.Pełnomocnik następnie wywołuje zdarzenie obsługi metody dla adresata, dostarczającej dane zdarzenie.Typ obiektu delegowanego dla danego zdarzenia jest zdefiniowany przez źródło zdarzenia.Aby uzyskać więcej informacji, zobacz Zdarzenia (Podręcznik programowania C#).

Porównanie delegatów dwa różne typy przypisane w czasie kompilacji spowoduje błąd kompilacji.W przypadku wystąpienia obiektu delegowanego statycznie typu System.Delegate, następnie porównanie jest dozwolone, ale zostanie uruchomione return false na czas.Na przykład:

delegate void Delegate1();
delegate void Delegate2();

static void method(Delegate1 d, Delegate2 e, System.Delegate f)
{
    // Compile-time error.
    //Console.WriteLine(d == e);

    // OK at compile-time. False if the run-time type of f 
    // is not the same as that of d.
    System.Console.WriteLine(d == f);
}

Zobacz też

Informacje

Pełnomocnicy (Podręcznik programowania C#)

Za pomocą odchylenia w delegatów (C# i Visual Basic)

Za pomocą wariancji dla Func i działania delegatów rodzajowy (C# i Visual Basic)

Zdarzenia (Podręcznik programowania C#)

Koncepcje

Podręcznik programowania C#

WARIANCJA delegatów (C# i Visual Basic)