Методы расширения
Примечание.
Это содержимое перепечатывается разрешением 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.