Поделиться через


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

Замечание

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

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

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

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

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

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

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

❌ Избегайте общего именования пространств имен, выделенных для методов расширения (например, «Расширения»). Вместо этого используйте описательное название (например, "Маршрутизация").

© Часть 2005, 2009 Корпорация Майкрософт. Все права защищены.

Перепечатан с разрешения Pearson Education, Inc. из Руководство по проектированию: Соглашения, идиомы и шаблоны для повторного использования библиотек .NET, 2-е издание Кшиштоф Чвалина и Брэд Абрамс, опубликованное 22 октября 2008 года Addison-Wesley Профессиональный в рамках серии разработки Microsoft Windows.

См. также