Почему Microsoft использует методы расширения для своих собственных классов? - PullRequest
6 голосов
/ 05 августа 2011

Почему Microsoft использует методы расширения для классов, которые она создает;вместо того, чтобы просто добавлять методы в классы или создавать дочерние классы?

Ответы [ 5 ]

12 голосов
/ 05 августа 2011

Существует ряд причин, по которым Microsoft сделала это.Два самых больших из них:

  1. Методы расширения применяются к интерфейсам, а не только к классам.Если бы Microsoft просто добавила методы Linq непосредственно в IEnumerable, для реализации этих методов потребовалась бы каждая конкретная реализация этого интерфейса.Делая их методами расширения, написанными в терминах существующего поведения IEnumerable <>, каждый класс IEnumerable <> получает их автоматически.

  2. Для фреймворков 3.0 и 3.5 ядро ​​System.dllбиблиотека 2.0Все новое в версии 3.0 и 3.5 было добавлено в System.Core или других связанных библиотеках.Например, единственный способ получить новый метод в классе List <>, который существует в 3.5, но не в 2.0, - это сделать метод расширения доступным в библиотеке 3.5.

2 голосов
/ 05 августа 2011

IgnoreRoute() на RouteCollection - это метод расширения, поскольку он предназначен для использования с инфраструктурой MVC, а не с основным приложением ASP.NET.Я полагаю, что они не хотели загрязнять класс RouteCollection методами, которые не нужны не-MVC-приложениям, и в то же время позволяли приложениям MVC использовать этот класс.

I'mне уверен, что этот подход обязательно имеет смысл (поскольку, например, они могли просто создать дочерний класс);по более общим причинам, что методы расширения могут быть использованы, другие ответили хорошо.

0 голосов
/ 29 января 2016

Я думаю, что главная причина в том, что такие методы очень легко расширить. Например, если вы используете методы расширения Linq, вы можете легко написать свой собственный набор методов расширения (может быть, foreach или какой-то определенный фильтр), которые будут прекрасно работать с методами Microsoft: mylist.Where (...). MyFilter (...). Выберите (...)

0 голосов
/ 23 мая 2012

Это пример шаблона Non-Virtual Interface (аналогично Template Method ). Это шаблон, используемый в языках с множественным (реализационным) наследованием, и способ сделать это в C # - использовать методы расширения.

Основная идея заключается в том, что у вас есть только не виртуальные и чисто виртуальные (абстрактные) методы. Разработчик интерфейса (или наследник класса / mixin в языках с множественным наследованием) реализует небольшой метод или набор методов (в данном случае, GetEnumerator), а взамен получает целый ряд методов, которые зависят от этого. один абстрактный метод (например, Select, Where, Aggregate и т. д.)

Как сказал Майкл Иденфилд в своем ответе, если мы хотим внедрить этот шаблон и хотим, чтобы IEnumerable был интерфейсом, нам нужно использовать методы расширения. И делать IEnumerable в абстрактном классе было бы плохо, потому что он должен быть очень дешевым, базовым интерфейсом, который должен быть встроен практически в любую коллекцию - реализация IEnumerable не должна требовать переосмысления иерархии классов, она должна быть почти «бесплатной» ».

0 голосов
/ 05 августа 2011

Мои два цента:

поскольку методы расширения были добавлены только в более поздних версиях .NET Framework, у них уже были .NET Framework 1, 1.1, 2.0 и новее, а затем в какой-то момент они добавили методы расширения, чтобы использовать их для расширения набора функций на вершина существующих классов.

...