Używanie delegatów (Przewodnik programowania w języku C#)

Element delegować jest typ, który hermetyzuje bezpieczne metody, podobnie jak funkcja wskaźnik w C i C++.W odróżnieniu od wskaźników funkcji C delegatów zorientowane obiektowo, wpisz bezpieczne i bezpieczny.Typ delegata jest zdefiniowana przez nazwę delegat.Poniższy przykład deklaruje delegata o nazwie Del który umożliwiająca Hermetyzowanie metody pobierającej ciąg jako argument i zwraca void:

public delegate void Del(string message);

Obiekt delegata zazwyczaj jest tworzony przez zapewniające nazwę metody delegat będzie zawijany lub z metody anonimowej.Po utworzenia wystąpienia delegata wywołania metody do delegat zostaną przekazane przez delegata do tej metody.Parametry przekazane do delegat przez obiekt wywołujący jest przekazywany do metody, oraz w zwracanej wartości, jeśli występuje, z metody do obiektu wywołującego przez delegata.Jest to nazywane wywoływanie delegat.Może być wywoływana występującego delegata, tak jakby był on opakowana 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");

Delegat typów pochodzących z Delegate klasa w programie .NET Framework.Delegat typy zapieczętowanego— nie może pochodzić od — i nie jest możliwe ustalenie niestandardowej klasy z Delegate.Ponieważ występującego delegata jest obiektem, można przekazany jako parametr, lub przypisane do właściwości.Dzięki temu metodę, aby zaakceptować delegata jako parametr i wywołać delegat niektóre później.To jest nazywana asynchronicznego wywołania zwrotnego i jest wspólne metody powiadamianie osoby wywołującej długi proces został zakończony.Jeśli delegat jest używana w taki sposób, kod przy użyciu delegat nie musi znać implementacja metody używane.Funkcje jest podobna do hermetyzacji, interfejsy dostarczane przez.

Innym typowym zastosowaniem wywołania zwrotne jest definiowanie metodę niestandardowe porównania i przekazywania tego delegata do 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 parametru:

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

Następnie można przekazać delegata utworzony w poprzednim przykładzie do tej metody:

MethodWithCallback(1, 2, handler);

uprawnia do następujących informacji wyjściowych do konsoli:

The number is: 3

Przy użyciu delegat abstrakcję, MethodWithCallback , nie trzeba wywoływać bezpośrednio z konsoli — nie musi być zaprojektowany z myślą o konsoli biznesowe.Co MethodWithCallback jest to po prostu przygotowania ciąg i przekazać ciąg do innej metody.Jest to szczególnie zaawansowanych, ponieważ delegowanego metody można użyć dowolnej liczbie parametrów.

Gdy delegata jest tworzony do zakodowania metody wystąpienia, delegat odwołuje się zarówno wystąpienie i metody.Delegat nie ma informacji typu wystąpienia jako uzupełnienie metodę, która jest zawijany, więc tak długo, jak jest metodą na tym obiekcie pasującego podpisu delegata delegata mogą odwoływać się do dowolnego typu obiektu.Delegat jest tworzony do zakodowania metodę statyczną, się tylko odwołuje metody.Rozważ następujące deklaracje:

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

Wraz z statycznego DelegateMethod wyświetlone wcześniej, teraz mamy trzy metody, które mogą zostać opakowany przez Del wystąpienie.

Delegat można wywołać więcej niż jednej metody po wywołaniu.To jest nazywane multiemisji.Aby dodać dodatkowe metody do delegata lista metod — na liście wywołania — po prostu wymaga dwóch delegatów za pomocą dodatkowych lub dodanie operatory przypisania Dodawanie ("+" 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 liście wywołania —Method1, Method2, i DelegateMethod.Oryginalne trzech delegatów, d1, d2, i d3, pozostają bez zmian.Gdy allMethodsDelegate jest wywołane, wszystkie trzy metody są wywoływane w kolejności.Jeśli delegat korzysta z parametrów odwołania, odwołanie jest przekazywana sekwencyjnie do wszystkich trzech metod z kolei, a wszystkie zmiany przez jedną metodę są widoczne do następnej metody.Kiedy dowolnej z metod zgłasza wyjątek, który nie zostanie zablokowany w metodzie, czy wyjątek jest przekazywana do obiektu wywołującego delegat i nie kolejnych metod na liście wywołania są wywoływane.Jeśli delegat ma zostać zwrócona wartość i/lub parametry wyjściowe, zwraca wartość zwracaną i parametry ostatnich wywoływanej metody.Aby usunąć metodę z listy wywołanie, użyj Zmniejsz lub zmniejszanie operator przypisania ("-" lub "'-='").Na przykład:

//remove Method1
allMethodsDelegate -= d1;

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

Ponieważ typy delegata pochodzących z System.Delegate, w delegat można wywołać metody i właściwości zdefiniowane przez tę klasę.Na przykład można znaleźć wiele sposobów delegata wywołania liście, może pisania:

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

Pochodzić od klasy delegatów z więcej niż jednej metody na liście wywołania MulticastDelegate, który jest podklasą klasy System.Delegate.Powyższe kod działa w obu przypadkach, ponieważ obsługuje obie klasy GetInvocationList.

Delegaci multiemisji są szeroko w obsłudze zdarzeń.Obiekty źródła zdarzeń wysyłać powiadomienia o zdarzeniach do odbiorcy obiektów, które mają zarejestrowany i będzie otrzymywać tych zdarzeń.Aby zarejestrować zdarzenie, odbiorca tworzy metodę przeznaczone do obsługi zdarzeń, a następnie tworzy delegata dla tej metody i przekazuje delegat źródła zdarzenia.Źródło wywołuje delegata w momencie wystąpienia zdarzenia.Delegat wywołuje zdarzenie obsługi metody w odbiorcy, dostarczając im dane zdarzenia.Typ delegata dla danego zdarzenia jest zdefiniowana przez źródło zdarzenia.Aby uzyskać więcej informacji, zobacz Zdarzenia (Przewodnik programowania w języku C#).

Porównanie delegatów dwóch różnych typów przypisane w czasie kompilacji spowoduje błąd kompilacji.W przypadku wystąpienia delegata statycznie typu System.Delegate, następnie porównania jest dozwolone, ale zostanie uruchomiony zwróci wartość false w czasie.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

Delegaty (Przewodnik programowania w języku C#)

Korzystanie z wariancji w delegatach (C# i Visual Basic)

Korzystanie z wariancji dla delegatów Func i Action (C# i Visual Basic)

Zdarzenia (Przewodnik programowania w języku C#)

Koncepcje

Przewodnik programowania w języku C#

Wariancje w delegatach (C# i Visual Basic)