Metody rozszerzeńExtension Methods

Metody rozszerzenia są funkcją języka, umożliwiająca metody statyczne, które można wywoływać za pomocą składni wywołania metody wystąpienia.Extension methods are a language feature that allows static methods to be called using instance method call syntax. Te metody musi mieć co najmniej jeden parametr, który reprezentuje wystąpienie, którego metoda jest używana w ramach operacji.These methods must take at least one parameter, which represents the instance the method is to operate on.

Klasa, która definiuje takie metody rozszerzenia jest określany jako klasy "sponsora", a musi być zadeklarowana jako statyczna.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. Można użyć metod rozszerzających, jeden zaimportować Definiowanie klasy sponsora przestrzeni nazw.To use extension methods, one must import the namespace defining the sponsor class.

X AVOID frivolously definiowania metod rozszerzenia, szczególnie w przypadku typów nie jesteś właścicielem.X AVOID frivolously defining extension methods, especially on types you don’t own.

Jeśli jesteś właścicielem kodu źródłowego typu, metody regularnego wystąpienia zamiast tego Rozważ użycie.If you do own source code of a type, consider using regular instance methods instead. Jeśli nie jesteś właścicielem, i chcesz dodać metodę, należy zwrócić szczególną uwagę.If you don’t own, and you want to add a method, be very careful. Liberalne stosowanie metod rozszerzenia stwarza możliwość potencjalnego zaśmiecania interfejsów API, typów, które nie zostały zaprojektowane do mieć tych metod.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

✓ CONSIDER przy użyciu metod rozszerzenia w jednym z następujących scenariuszy:✓ CONSIDER using extension methods in any of the following scenarios:

  • Zapewnienie pomocy funkcji, które dotyczą każdej implementacji interfejsu, w przypadku funkcji mogą być napisane pod kątem interfejsu core.To provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. Jest to spowodowane konkretnych implementacji, w przeciwnym razie nie można przypisać do interfejsów.This is because concrete implementations cannot otherwise be assigned to interfaces. Na przykład LINQ to Objects operatory są implementowane jako metody rozszerzenia dla wszystkich IEnumerable<T> typów.For example, the LINQ to Objects operators are implemented as extension methods for all IEnumerable<T> types. W związku z dowolnego IEnumerable<> implementacja jest włączane automatycznie LINQ.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • Gdy metoda wystąpienia spowodowałoby to powstanie zależności pewnego typu, ale takie zależności zaburzyłaby reguły zarządzania zależności.When an instance method would introduce a dependency on some type, but such a dependency would break dependency management rules. Na przykład zależność od String do System.Uri prawdopodobnie nie jest pożądane, a tym samym String.ToUri() metodę wystąpienia, zwracając System.Uri będzie niewłaściwy projekt z punktu widzenia zarządzania zależności.For example, a dependency from String to System.Uri is probably not desirable, and so String.ToUri() instance method returning System.Uri would be the wrong design from a dependency management perspective. Metody statyczne rozszerzenie Uri.ToUri(this string str) zwracanie System.Uri będzie znacznie lepiej projektu.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

X AVOID definiowanie metody rozszerzenia na System.Object.X AVOID defining extension methods on System.Object.

Użytkownicy VB nie będzie wywoływać tych metod w odwołania do obiektu za pomocą składni metody rozszerzenia.VB users will not be able to call such methods on object references using the extension method syntax. VB nie obsługuje wywoływania takich metod, ponieważ w języku Visual Basic, deklaruje odwołanie, jako obiekt wymusza wszystkich wywołań metod w celu Spóźnię się powiązany (rzeczywistego elementu członkowskiego, wywoływana jest określana w czasie wykonywania), podczas gdy powiązania z metody rozszerzenia są określane w czasie kompilacji (wcześnie powiązany).VB does not support calling such methods because, in VB, declaring a reference as Object forces all method invocations on it to be late bound (actual member called is determined at runtime), while bindings to extension methods are determined at compile-time (early bound).

Należy pamiętać, że wytyczna ma zastosowanie do innych języków, w którym znajduje się takie samo zachowanie powiązania, lub gdy metody rozszerzenia nie są obsługiwane.Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported.

X DO NOT umieszczenia metod rozszerzenia w tej samej przestrzeni nazw jako typ rozszerzony, chyba że jest dodanie metody interfejsów lub zarządzania zależności.X DO NOT put extension methods in the same namespace as the extended type unless it is for adding methods to interfaces or for dependency management.

X AVOID zdefiniowania co najmniej dwie metody rozszerzenia o tej samej sygnaturze, nawet jeśli są one przechowywane w różnych przestrzeniach nazw.X AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

✓ CONSIDER definiowanie metody rozszerzenia w tej samej przestrzeni nazw jako typ rozszerzonej, jeśli typ jest interfejsem i metody rozszerzenia są przeznaczone do użycia w przypadku większości lub wszystkim.✓ CONSIDER defining extension methods in the same namespace as the extended type if the type is an interface and if the extension methods are meant to be used in most or all cases.

X DO NOT definiować metody rozszerzenia wdrożenie funkcją w przestrzeniach nazw zwykle skojarzone z innymi funkcjami.X DO NOT define extension methods implementing a feature in namespaces normally associated with other features. Zamiast tego zdefiniuj je w przestrzeni nazw skojarzonego z funkcją, które należą do.Instead, define them in the namespace associated with the feature they belong to.

X AVOID ogólnego nazewnictwa przestrzeni nazw przeznaczona do metody rozszerzenia (np. "rozszerzenia").X AVOID generic naming of namespaces dedicated to extension methods (e.g., "Extensions"). Użyj nazwy opisowej (np. "Routing") zamiast tego.Use a descriptive name (e.g., "Routing") instead.

Portions © 2005, 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Przedrukowano za uprawnienie Pearson edukacji, Inc. z wytyczne dotyczące projektowania Framework: Konwencje, Idiomy i wzorców dla wielokrotnego użytku, do bibliotek .NET, wydanie 2 Krzysztof Cwalina i Brad Abrams publikowane 22 Oct 2008 przez Addison Wesley Professional w ramach serii rozwoju Windows firmy Microsoft.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 as part of the Microsoft Windows Development Series.

Zobacz takżeSee also