Методы расширенияExtension Methods

Методы расширения являются компонентом языка, который позволяет статических методов, вызываемых с помощью синтаксиса вызова метода экземпляра.Extension methods are a language feature that allows static methods to be called using instance method call syntax. Эти методы необходимо выполнить хотя бы один параметр, который представляет экземпляр, метод должен работать.These methods must take at least one parameter, which represents the instance the method is to operate on.

Класс, который определяет такие методы расширения упоминается как класса «спонсора», и они должны объявляться как статические.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. Чтобы использовать методы расширения, один необходимо импортировать пространство имен определения класса спонсора.To use extension methods, one must import the namespace defining the sponsor class.

X AVOID frivolously определяет методы расширения, особенно на типах, вы не являетесь его владельцем.X AVOID frivolously defining extension methods, especially on types you don’t own.

Если у вас есть исходный код типа, рекомендуется использовать методы регулярных экземпляра.If you do own source code of a type, consider using regular instance methods instead. Если вы не являетесь, и вы хотите добавить метод, необходимо Будьте очень осторожным.If you don’t own, and you want to add a method, be very careful. Если правильно использовать методы расширения может загромождения интерфейсов API типов, которые не были предназначены для этих методов.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

✓ CONSIDER с помощью методов расширения в следующих сценариях:✓ CONSIDER using extension methods in any of the following scenarios:

  • Для предоставления вспомогательные функции, необходимые для каждой реализации интерфейса, если говорят, что функциональные возможности могут быть написаны с точки зрения основной интерфейс.To provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. Это обусловлено конкретные реализации в противном случае не могут быть назначены интерфейсов.This is because concrete implementations cannot otherwise be assigned to interfaces. Например LINQ to Objects операторы реализуются как методы расширения для всех IEnumerable<T> типов.For example, the LINQ to Objects operators are implemented as extension methods for all IEnumerable<T> types. Таким образом, любой IEnumerable<> реализуется автоматически с поддержкой LINQ.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • Когда метод экземпляра стало бы причиной возникновения зависит от какого-либо типа, но такая зависимость будет нарушена правил управления зависимостей.When an instance method would introduce a dependency on some type, but such a dependency would break dependency management rules. К примеру, зависимость от String для System.Uri скорее всего, не является предпочтительным и поэтому String.ToUri() экземпляр метода возвращает System.Uri бы использования неправильного проекта с точки зрения управления зависимостей.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. Статический метод расширения Uri.ToUri(this string str) возвращение System.Uri было бы гораздо лучше.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

X AVOID определения методов расширения в System.Object.X AVOID defining extension methods on System.Object.

VB пользователи не будут иметь возможность вызывать такие методы для ссылки на объекты, с помощью синтаксиса метода расширения.VB users will not be able to call such methods on object references using the extension method syntax. VB не поддерживает вызов таких методов, так как для VB, объявления ссылки, как объект заставляет все вызовы методов в нем опаздываете привязка к (фактический элемент с именем определяется во время выполнения), во время привязки к методам расширения определяются во время компиляции (ранняя привязки).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).

Обратите внимание на то, что правило применяется для других языков, где присутствует одно и то же поведение привязки, или где методы расширения не поддерживаются.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 размещения методов расширения в пространстве имен, расширенного типа, если он предназначен для добавления методов в интерфейсах или для управления зависимостями.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 определение два или несколько методов расширения с такой же сигнатурой, даже если они находятся в разных пространствах имен.X AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

✓ CONSIDER определение методов расширения в пространстве имен, расширенный тип, если тип является интерфейсом и методы расширения предназначены для использования в большинство или все случаи.✓ 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 определяет расширение методов реализации функции в пространствах имен, обычно связанные с другими компонентами.X DO NOT define extension methods implementing a feature in namespaces normally associated with other features. Вместо этого их определения в пространстве имен, связанного с данным компонентом, которому они принадлежат.Instead, define them in the namespace associated with the feature they belong to.

X AVOID универсального именования пространств имен, выделенных для методов расширения (например, «расширения»).X AVOID generic naming of namespaces dedicated to extension methods (e.g., "Extensions"). Используйте описательное имя (например, «маршрутизации») вместо этого.Use a descriptive name (e.g., "Routing") instead.

Фрагменты: © Корпорация Майкрософт (Microsoft Corporation), 2005, 2009. Все права защищены.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Перепечатано разрешением Пирсона для образовательных учреждений, Inc. из рекомендации по разработке Framework: Условные обозначения, стили и шаблоны для библиотеки .NET для повторного использования, 2nd Edition Кшиштов Квалина и Брэд Абрамс, опубликованных 22 октября 2008 г., издательство Addison-Wesley Professional как части цикла разработки Microsoft Windows.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.

См. такжеSee also