Metody rozszerzania

Uwaga

Ta zawartość jest drukowana przez uprawnienie Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Wydanie to zostało opublikowane w 2008 roku, a książka została w pełni zmieniona w trzecim wydaniu. Niektóre informacje na tej stronie mogą być nieaktualne.

Metody rozszerzeń to funkcja języka, która umożliwia wywoływanie metod statycznych przy użyciu składni wywołania metody wystąpienia. Metody te muszą przyjmować co najmniej jeden parametr, który reprezentuje wystąpienie, na którym ma działać metoda.

Klasa, która definiuje takie metody rozszerzenia, jest określana jako klasa "sponsor" i musi być zadeklarowana jako statyczna. Aby użyć metod rozszerzeń, należy zaimportować przestrzeń nazw definiującą klasę sponsora.

❌ UNIKAJ bezwolnie definiowania metod rozszerzeń, zwłaszcza w przypadku typów, których nie posiadasz.

Jeśli jesteś właścicielem kodu źródłowego typu, rozważ zamiast tego użycie zwykłych metod wystąpienia. Jeśli nie jesteś właścicielem i chcesz dodać metodę, zachowaj ostrożność. Liberalne użycie metod rozszerzeń ma potencjał zaśmiecania interfejsów API typów, które nie zostały zaprojektowane do używania tych metod.

✔️ ROZWAŻ użycie metod rozszerzeń w dowolnym z następujących scenariuszy:

  • Aby zapewnić funkcjonalność pomocnika istotna dla każdej implementacji interfejsu, jeśli ta funkcja może być napisana pod względem podstawowego interfejsu. Dzieje się tak, ponieważ konkretne implementacje nie mogą być przypisane do interfejsów. Na przykład LINQ to Objects operatory są implementowane jako metody rozszerzenia dla wszystkich IEnumerable<T> typów. W związku z tym każda implementacja IEnumerable<> jest automatycznie włączona przez LINQ.

  • Gdy metoda wystąpienia wprowadzi zależność od określonego typu, ale taka zależność spowoduje przerwanie reguł zarządzania zależnościami. Na przykład zależność od String do System.Uri prawdopodobnie nie jest pożądana, a więc String.ToUri() zwracana System.Uri metoda wystąpienia będzie niewłaściwym projektem z perspektywy zarządzania zależnościami. Metoda statycznego rozszerzenia Uri.ToUri(this string str) zwracająca System.Uri byłaby znacznie lepszym projektem.

❌ UNIKAJ definiowania metod rozszerzeń w systemie System.Object.

Użytkownicy języka VB nie będą mogli wywoływać takich metod w odwołaniach do obiektów przy użyciu składni metody rozszerzenia. Język VB nie obsługuje wywoływania takich metod, ponieważ w języku VB deklarowanie odwołania jako obiekt wymusza na nim opóźnienie wywołań metod (rzeczywista nazwa elementu członkowskiego jest określana w czasie wykonywania), podczas gdy powiązania z metodami rozszerzenia są określane w czasie kompilacji (wczesna granica).

Należy pamiętać, że wytyczne dotyczą innych języków, w których występuje to samo zachowanie powiązania lub gdzie metody rozszerzenia nie są obsługiwane.

❌ NIE umieszczaj metod rozszerzeń w tej samej przestrzeni nazw co typ rozszerzony, chyba że służy do dodawania metod do interfejsów lub zarządzania zależnościami.

❌ UNIKAJ definiowania co najmniej dwóch metod rozszerzenia z tym samym podpisem, nawet jeśli znajdują się w różnych przestrzeniach nazw.

✔️ ROZWAŻ zdefiniowanie metod rozszerzeń w tej samej przestrzeni nazw co typ rozszerzony, jeśli typ jest interfejsem i czy metody rozszerzenia mają być używane w większości lub we wszystkich przypadkach.

❌ NIE należy definiować metod rozszerzeń implementowania funkcji w przestrzeniach nazw zwykle skojarzonych z innymi funkcjami. Zamiast tego zdefiniuj je w przestrzeni nazw skojarzonej z funkcją, do której należą.

❌ UNIKAJ ogólnego nazewnictwa przestrzeni nazw dedykowanych metodom rozszerzeń (np. "Rozszerzenia"). Zamiast tego użyj nazwy opisowej (np. "Routing").

© Części 2005, 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.

Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published oct 22, 2008 by Addison-Wesley Professional w ramach Microsoft Windows Development Series.

Zobacz też