Что будет, если все статические методы будут расширены по умолчанию? - PullRequest
4 голосов
/ 01 сентября 2010

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

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

Редактировать

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

Ответы [ 4 ]

3 голосов
/ 01 сентября 2010

Хотя многие статические методы, особенно для типов значений и строк, работают с экземплярами самих себя, существуют статические методы, для которых синтаксис расширения не имеет смысла, поскольку они не действуют на свой собственный тип. Например, ConfigurationManager является «чисто статическим», в котором нет компонента экземпляра; нет смысла пытаться структурировать любой такой вызов как метод расширения.

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

Наконец, методы расширения хороши в умеренности. Тем не менее, мой текущий проект стал, пожалуй, слишком «беглым»; у нас есть обертки для метода расширения для большей части статики String, такие как IsNullOrEmpty () и Format (), а также методы разбора для каждого типа значения (обертки для int.Parse, byte.Parse, DateTime.Parse и т. д.) и вариантов (например, TryParses, IsNullOrBlank, IsNotNullOrEmpty и т. д.). Есть много вещей, которые вы можете сделать с экземпляром строки, и в нашем проекте большинство из них можно прикрепить к концу этого экземпляра (даже литералу). Это значительно замедляет VS, когда вы достигаете этого периода, и увеличивает объем используемой памяти (и ReSharper, который предоставляет расширения IntelliSense и предложения / рекомендации по использованию).

2 голосов
/ 01 сентября 2010

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

Например, возьмите Process.Start(ProcessStartInfo): это статический метод, который вызывается для Processтип.Было бы странно, если бы это был метод расширения, поскольку вам нужно было бы создать экземпляр Process перед его фактическим вызовом (примечание: да, есть метод Process.Start, который работает с экземплярами,но предполагается, что объект Process уже заполнил свою начальную информацию).

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

0 голосов
/ 01 сентября 2010

С одной стороны, будет огромная неоднозначность, когда дело доходит до int.Parse (string), double.Parse (string) и т. Д., Которые хотят одновременно стать методами расширения для строки.Это важное конструктивное решение относительно того, должен ли метод логически расширять функциональность оперируемого типа, а не логически ассоциироваться с типом, определяющим статический метод.

0 голосов
/ 01 сентября 2010

Все методы расширения являются статическими методами. Разница в том, что в методе расширения первый параметр в сигнатуре метода должен включать ключевое слово this, чтобы указать, для какого типа метод является расширением ... В некотором смысле метод является статическим по отношению к типу, в котором он определен, но (как упоминает Крис в своем ответе) они нестатичны (экземпляр) по отношению к типу, определенному в первом параметре ...

Если бы все статические методы были расширены по умолчанию, что бы вы сделали со старым кодом, в котором нет ключевого слова thgis? и как компилятор узнает, к какому типу «прикрепить» метод расширения?

...