Delegaty (Przewodnik programowania w języku C#)
Delegat to typ reprezentujący odwołania do metod z określoną listą parametrów i zwracanym typem. Podczas tworzenia wystąpienia delegata można skojarzyć jego wystąpienie z dowolną metodą mającą zgodny podpis i zwracany typ. Za pośrednictwem wystąpienia delegata można wywołać metodę.
Delegaty służą do przekazywania metod jako argumentów do innych metod. Programy obsługi zdarzeń to po prostu metody, które są wywoływane za pośrednictwem delegatów. Użytkownik tworzy metodę niestandardową, a klasa, taka jak formant systemu Windows, może wywołać tę metodę, gdy wystąpi określone zdarzenie. W poniższym przykładzie pokazano deklarację delegata:
public delegate int PerformCalculation(int x, int y);
Do delegata można przypisać każdą metodę z dowolnej dostępnej klasy lub struktury, która pasuje do typu delegata. Może to być metoda statyczna lub metoda wystąpienia. Ta elastyczność oznacza, że można programowo zmienić wywołania metod lub podłączyć nowy kod do istniejących klas.
Uwaga
W kontekście przeciążania metod podpis metody nie zawiera wartości zwracanej. Jednak w kontekście delegatów podpis zawiera wartość zwracaną. Innymi słowy metoda musi mieć taki sam zwracany typ jak delegat.
Ta możliwość odwoływania się do metody jak do parametru sprawia, że delegaty idealnie nadają się do definiowania metod wywoływania zwrotnego. Możesz napisać metodę, która porównuje dwa obiekty w aplikacji. Tej metody można użyć w delegatu dla algorytmu sortowania. Ponieważ kod porównania jest oddzielony od biblioteki, metoda sortowania może być bardziej ogólna.
Wskaźniki funkcji zostały dodane do języka C# 9 w przypadku podobnych scenariuszy, w których potrzebna jest większa kontrola nad konwencją wywoływania. Kod skojarzony z delegatem jest wywoływany przy użyciu metody wirtualnej dodanej do typu delegata. Za pomocą wskaźników funkcji można określić różne konwencje.
Omówienie delegatów
Delegaty mają następujące właściwości:
- Delegaty są podobne do wskaźników funkcji języka C++, ale delegaty są w pełni obiektowe i w przeciwieństwie do wskaźników C++ do funkcji składowych, delegaty hermetyzują zarówno wystąpienie obiektu, jak i metodę.
- Delegaty zezwalają na przekazywanie metod jako parametrów.
- Delegatów można używać do definiowania metod wywoływania zwrotnego.
- Delegaty można łączyć w łańcuch; na przykład w jednym zdarzeniu można wywołać wiele metod.
- Metody nie muszą dokładnie odpowiadać typowi delegata. Aby uzyskać więcej informacji, zobacz Using Variance in Delegates (Używanie wariancji w delegatach).
- Wyrażenia lambda to bardziej zwięzły sposób pisania wbudowanych bloków kodu. Wyrażenia lambda (w niektórych kontekstach) są kompilowane w celu delegowania typów. Aby uzyskać więcej informacji na temat wyrażeń lambda, zobacz Wyrażenia lambda.
W tej sekcji
- Używanie delegatów
- Kiedy należy używać delegatów zamiast interfejsów (Przewodnik programowania w języku C#)
- Delegaty z metodami nazwanymi lub Metody anonimowe
- Korzystanie z wariancji w delegatach
- Jak łączyć delegatów (delegatów multiemisji)
- Deklarowanie, tworzenie wystąpień i użycie delegowania
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Delegaty w specyfikacji języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.
Polecane rozdziały książki
- Delegaci, zdarzenia i wyrażenia lambda w podręczniku języka C# 3.0, trzecia wersja: ponad 250 rozwiązań dla programistów języka C# 3.0
- Delegaty i zdarzenia w Edukacja C# 3.0: Podstawy języka C# 3.0