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

Примечание.

Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.

Методы расширения — это функция языка, которая позволяет вызвать статические методы с помощью синтаксиса вызова метода экземпляра. Эти методы должны принимать хотя бы один параметр, представляющий экземпляр, с которым должен работать метод.

Класс, который определяет такие методы расширения, называется классом спонсора и должен быть объявлен как статический. Чтобы использовать методы расширения, необходимо импортировать пространство имен, определяющее класс спонсора.

❌ ИЗБЕГАЙТЕ поверхностного определения методов расширения, особенно для типов, которыми вы не владеете.

Если вы владеете исходным кодом типа, рассмотрите возможность использования обычных методов экземпляра. Если вы не владеете им и хотите добавить метод, будьте очень осторожны. Обильное использование методов расширения может перегрузить интерфейсы API типов, которые не предназначены для этих методов.

✔️ РАССМОТРИТЕ возможность использования методов расширения в любом из следующих сценариев:

  • Для предоставления вспомогательных функциональных возможностей, относящихся к каждой реализации интерфейса, если указанную функциональность можно написать с учетом базового интерфейса. Это обусловлено тем, что конкретные реализации нельзя назначить интерфейсам другими способами. Например, операторы LINQ to Objects реализуются как методы расширения для всех типов IEnumerable<T>. Таким образом, любая реализация IEnumerable<> автоматически имеет поддержку LINQ.

  • Если метод экземпляра порождает зависимость от какого-либо типа, то такая зависимость приведет к нарушению правил управления зависимостями. Например, зависимость от String к System.Uri, возможно, нежелательна, поэтому метод экземпляра String.ToUri(), возвращающий System.Uri, будет неправильной реализацией с точки зрения управления зависимостями. Эффективнее будет реализовать статический метод расширения Uri.ToUri(this string str), возвращающий System.Uri.

❌ ИЗБЕГАЙТЕ определения методов расширения для System.Object.

Пользователи Visual Basic не смогут вызывать такие методы для ссылок на объекты с помощью синтаксиса метода расширения. VB не поддерживает вызов таких методов, так как в VB объявление ссылки в качестве объекта заставляет все вызовы метода быть в конце привязки (фактический член определяется во время выполнения), а привязки к методам расширения определяются во время компиляции (ранняя привязка).

Обратите внимание, что это правило применяется к другим языкам, где присутствует такое же поведение привязки или не поддерживаются методы расширения.

❌ НЕ помещайте методы расширения в то же пространство имен, что и расширенный тип, за исключением случаев, когда они предназначены для добавления методов в интерфейсы или для управления зависимостями.

❌ Не определяйте два и более методов расширения с одинаковой сигнатурой, даже если они находятся в разных пространствах имен.

✔️ РАССМОТРИТЕ возможность определения методов расширения в том же пространстве имен, что и расширенный тип, если тип является интерфейсом и методы расширения предназначены для использования в большинстве или во всех случаях.

❌ НЕ определяйте методы расширения, реализующие функцию в пространствах имен, которые обычно связаны с другими функциями. Вместо этого определите их в пространстве имен, связанном с функцией, к которой они относятся.

❌ ИЗБЕГАЙТЕ универсального именования пространств имен, выделенных для методов расширения (например, "Расширения"). Вместо этого используйте описательное имя (например, "Маршрутизация").

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

Перепечатано с разрешения Pearson Education, Inc. из книги Инфраструктура программных проектов. Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET (2-е издание), авторы: Кржиштоф Цвалина (Krzysztof Cwalina) и Брэд Абрамс (Brad Abrams). Книга опубликована 22 октября 2008 г. издательством Addison-Wesley Professional в рамках серии, посвященной разработке для Microsoft Windows.

См. также