C # Расширение Методы Архитектура Вопрос - PullRequest
4 голосов
/ 12 марта 2009

Я недавно задал этот вопрос: Ошибка компилятора при обращении к пользовательскому методу расширения C #

Марк Гравелл ответил идеально, и это решило мою проблему. Но это дало мне возможность подумать ...

Если метод и метод Extension должны быть размещены в статическом классе, а сам метод должен быть статическим, почему мы не можем создать метод статического расширения?

Я понимаю, что параметр, помеченный как "this", будет использоваться для предоставления доступа к экземпляру объекта, который мы расширяем. Я не понимаю, почему метод не может быть статичным ... мне просто кажется, что это бессмысленное ограничение ...

Мой вопрос: почему мы не можем создать метод расширения, который будет работать как статический метод?

Ответы [ 4 ]

7 голосов
/ 12 марта 2009

Я ожидаю, что реальный ответ прост: не было хорошего варианта использования. Например, преимущество заключается в том, что он обеспечивает свободный API по сравнению с существующими типами (которые сами по себе не обеспечивают логику) - т.е.

var foo = data.Where(x=>x.IsActive).OrderBy(x=>x.Price).First();

, который включает LINQ:

var foo = (from x in data
           where x.IsActive
           order by x.Price
           select x).First();

Со статическими методами это просто не проблема, поэтому нет никакого оправдания; просто используйте статический метод для второго типа.

Как таковые, методы расширения не должным образом объектно-ориентированные - это прагматическое злоупотребление, чтобы облегчить жизнь за счет чистоты. Не было оснований для того, чтобы разбавлять статические методы таким же образом.

3 голосов
/ 12 марта 2009

Поскольку эта функция не существует в C #.

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

Например, XNA имеет класс MathHelper , который в идеале был бы статическим расширением класса Math .

Сообщество спрашивает , думаем ли мы, что это хорошая идея для C # 4.0

1 голос
/ 12 марта 2009

Я бы подумал о совместимости - если вы вдруг сделали все методы расширения статических методов с необходимостью оператора this, вы могли бы непреднамеренно нарушить код, который теперь переопределяет обычный метод с методом расширения.

Этот параметр разрешает управление и, следовательно, не нарушает совместимость.

Просто идея, хотя.

0 голосов
/ 12 марта 2009

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

Давайте представим, что у меня есть класс MyExts, который позволяет мне добавлять методы расширения в MyClass. Почему бы: -

MyClass.DoSomethingExtra();

будь лучше

MyExts.DoSomethingExtra();

...