Wprowadzenie do delegatów i zdarzeń w języku C#

Delegaci udostępniają mechanizm późnego powiązania na platformie .NET. Opóźnione powiązanie oznacza, że tworzysz algorytm, w którym obiekt wywołujący dostarcza również co najmniej jedną metodę implementjącą część algorytmu.

Rozważmy na przykład sortowanie listy gwiazd w aplikacji astronomicznej. Możesz posortować te gwiazdy według ich odległości od ziemi lub wielkości gwiazdy lub ich postrzeganej jasności.

We wszystkich tych przypadkach metoda Sort() zasadniczo działa tak samo: rozmieszcza elementy na liście na podstawie porównania. Kod porównujący dwie gwiazdki jest inny dla każdej kolejności sortowania.

Tego rodzaju rozwiązania były używane w oprogramowaniu od pół wieku. Koncepcja delegata języka C# zapewnia obsługę języka pierwszej klasy i bezpieczeństwo typów wokół koncepcji.

Jak zobaczysz w dalszej części tej serii, kod języka C#, który piszesz dla algorytmów, takich jak ten typ, jest bezpieczny. Kompilator zapewnia, że typy są zgodne z argumentami i zwracane typy.

Wskaźniki funkcji obsługują podobne scenariusze , w których potrzebna jest większa kontrola nad konwencją wywoływania. Kod skojarzony z pełnomocnikiem 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.

Cele projektowania języka dla delegatów

Projektanci języka wyliczali kilka celów funkcji, które ostatecznie stały się delegatami.

Zespół chciał mieć wspólną konstrukcję języka, która może być używana dla dowolnych algorytmów powiązania opóźnionego. Delegaci umożliwiają deweloperom poznanie jednej koncepcji i użycie tej samej koncepcji w wielu różnych problemach z oprogramowaniem.

Po drugie, zespół chciał obsługiwać zarówno wywołania metody pojedynczej, jak i multiemisji. (Delegaty multiemisji to delegaty, które łączą ze sobą wiele wywołań metod. W dalszej części tej serii zobaczysz przykłady).

Zespół chciał, aby delegaci obsługiwali bezpieczeństwo tego samego typu, którego deweloperzy oczekują od wszystkich konstrukcji języka C#.

Na koniec zespół rozpoznał wzorzec zdarzenia to jeden konkretny wzorzec, w którym delegaty lub dowolny algorytm opóźnionego powiązania są przydatne. Zespół chciał upewnić się, że kod delegatów może stanowić podstawę wzorca zdarzeń platformy .NET.

Wynikiem tej pracy była obsługa delegatów i zdarzeń w językach C# i .NET.

Pozostałe artykuły z tej serii będą obejmować funkcje języka, obsługę bibliotek i typowe idiomy używane podczas pracy z delegatami i zdarzeniami. Dowiesz się więcej o:

  • Słowo delegate kluczowe i kod, który generuje.
  • Funkcje w System.Delegate klasie i sposób ich użycia.
  • Jak utworzyć delegatów bezpiecznych typów.
  • Jak utworzyć metody, które można wywołać za pomocą delegatów.
  • Jak pracować z delegatami i zdarzeniami przy użyciu wyrażeń lambda.
  • Jak delegaty stają się jednym z bloków konstrukcyjnych LINQ.
  • Sposób, w jaki delegaty są podstawą wzorca zdarzeń platformy .NET i jak się różnią.

Zaczynajmy.

Dalej