Каковы мотивы разработки методов расширения в C # - PullRequest
1 голос
/ 22 января 2009

Мне было интересно, каков мотив разработки методов расширения в C #

Ответы [ 5 ]

11 голосов
/ 22 января 2009

Позволяет создавать новые функциональные возможности для существующей кодовой базы без редактирования исходного кода.

http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx

"Методы расширения позволяют разработчикам добавлять новые методы к общедоступному контракту существующего типа CLR без необходимости его подкласса или перекомпиляции исходного типа. Методы расширения помогают сочетать гибкость поддержки" утиной типизации " популярный в динамических языках сегодня с производительностью и проверкой во время компиляции строго типизированных языков. Методы расширения позволяют использовать множество полезных сценариев и помогают создать действительно мощную инфраструктуру запросов LINQ, которая вводится в .NET как часть выпуска "Orcas". "

3 голосов
/ 22 января 2009

Основной причиной их существования является возможность каким-либо образом добавлять функции к типу, не наследуя его.

Требовалось предоставить Where, Select, ... методы для использования в LINQ для коллекций, у которых их нет.

2 голосов
/ 22 января 2009

Обеспечивает множественное наследование через заднюю дверь.

Это такие языки, как C ++, которые поддерживают наследование от многих классов, методы расширения не требуются. Однако множественное наследование имеет много проблем, поэтому современные языки отказались от него. Однако методы расширения - это тот случай, когда множественное наследование полезно. Вместо того, чтобы заново вводить множественное наследование, дизайнеры C # создали методы расширения (что является очень аккуратным решением проблемы).

1 голос
/ 22 января 2009

Довольно часто мы в конечном итоге пишем для себя полезные маленькие служебные статические классы, которые выполняют общую функцию для типа. Я знаю, что было несколько раз, когда я хотел просто наследовать класс, чтобы добавить функцию, но этот класс запечатан. Я рад, что хотя они были запечатаны, необоснованное наследование - это плохо.

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

Они также имеют преимущество, заключающееся в том, что они не загрязняют фактическое пространство имен членов этого типа и позволяют выбирать их с помощью ключевого слова using.

0 голосов
/ 10 июня 2011

Существование расширенных методов весьма вероятно из-за необходимости для Microsoft добавить функциональность к IEnumerable без изменения интерфейса. Если бы они добавили методы к интерфейсу, то все существующие реализации IEnumerable (включая Microsoft) больше не будут компилироваться.

Альтернативой изменению IEnumerable является создание служебного класса (называемого Enumerable), который имеет методы, которые выполняют преобразования для экземпляров IEnumerable. Это работает, за исключением того, что пользовательский интерфейс отличается от вызова метода из существующего экземпляра IEnumerable. Например, сравните следующие эквивалентные утверждения.

IEnumerable<string> strings = myIntList.Select(num => num.ToString())
                                       .Where(num => num.StartsWith('T'));

IEnumerable<string> strings =
    Enumerable.Where(
        Enumerable.Select(myIntList, num => num.ToString()),
        num => num.StartsWith('T'));

Чтобы достичь лучшего из обоих миров, команда компилятора C # добавила поддержку методов расширения, позволив создать класс Enumerable со специальным синтаксисом и сохранив тот же пользовательский опыт, добавив методы для IEnumerable для начала. с.

...