2009-03-12 2 views
4

Недавно я задал этот вопрос: Compiler error referencing custom C# extension methodC# Методы расширения Архитектура Вопрос

Марк Gravell ответ был совершенен и решить мою проблему. Но мне было о чем подумать ...

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

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

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

ответ

7

Я ожидаю, что реальный ответ просто: был не хороший пример использования. Для случаев, преимущество заключается в том, что она позволяет свободно-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(); 

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

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

+2

Статические методы расширения могут избавить нас от всех тех «вспомогательных» классов, которые заполнены статическими методами. См. Отзывы, как в случае использования. –

3

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

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

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

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

+0

Повторите свое утверждение: это сообщество **, спрашивающее сообщество. Я не думаю, что Max Payne представляет Microsoft в этом вопросе. –

+0

Хорошая точка, отредактированный пост. –

+0

Достаточно честный; -p Ваша точка зрения о MathHelper очень верна - я просто задаюсь вопросом, достаточно ли это * достаточно, чтобы сделать разрез. –

0

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

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

MyClass.DoSomethingExtra(); 

быть лучше, чем

MyExts.DoSomethingExtra(); 

?

+0

Весь смысл статических расширений заключался бы в том, чтобы иметь возможность вызвать MyClass.DoSomethingExtra(), но определив его в MyExts для расширения MyClass. –

+0

Да, я понимаю, что мой вопрос обратно - ПОЧЕМУ вы хотели бы это сделать? Это не похоже на то, что вам не нужно сначала понимать, что они приходят из MyExts, потому что вам все равно придется использовать его для использования в файле. – AnthonyWJones

1

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

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

Только идея.