Почему члены статического класса должны быть объявлены как статические?Почему это не просто неявно? - PullRequest
24 голосов
/ 15 мая 2011

Очевидно, что в статическом классе не может быть члена экземпляра, так как этот класс никогда не может быть создан. Почему мы должны объявлять члены как статические?

Ответы [ 8 ]

44 голосов
/ 15 мая 2011

Мне постоянно задают такие вопросы. По сути, вопрос сводится к тому, «когда факт об объявленном члене может быть выведен компилятором, если явное объявление этого факта должно быть (1) обязательным, (2) необязательным или (3) запрещенным?»

Нет простого ответа. Каждый из них должен быть взят на индивидуальной основе. Требуется поместить «static» в член статического класса. Помещать «новый» в скрывающий, не переопределяющий метод производного класса необязательно. Помещение «статического» на const запрещено.

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

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

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

См. http://blogs.msdn.com/b/ericlippert/archive/2010/06/10/don-t-repeat-yourself-consts-are-already-static.aspx, чтобы узнать больше о подобных проблемах.

5 голосов
/ 15 мая 2011

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

2 голосов
/ 19 мая 2011

Я бы пошел еще дальше и спросил: почему в C # вообще есть статические классы?Это кажется странной концепцией, класс , который на самом деле не класс .Это просто контейнер, его нельзя использовать для ввода каких-либо переменных, параметров или полей.Вы также не можете использовать его как параметр типа.И, конечно, у вас никогда не будет экземпляра такого класса.

Я бы предпочел иметь модули, как в VB.NET и F # .И тогда, статический модификатор не будет необходим, чтобы избежать путаницы.

2 голосов
/ 15 мая 2011

Ричард,

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

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

Это хороший вопрос.... к сожалению, не один с "правильным" ответом ... если кто-то не может найти ссылку из блога C # -языков-дизайнеров (или аналогичного), обсуждающего это решение.То, что я могу вам сказать, это: «Я бы поставил 1000 долларов, чтобы это не случайно.»

Ура.Кит.

2 голосов
/ 15 мая 2011

Это может быть неявным, но также усложнит чтение кода и приведет к путанице.

1 голос
/ 15 мая 2011

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

1 голос
/ 15 мая 2011

Явное кодирование обеспечивает удобство обслуживания

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

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

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

Я вижу много причин, и существует много других причин.

0 голосов
/ 13 июля 2012

Это потому, что копировать-вставить будет сложнее.

Если вы копируете метод из статического класса в нестатический класс, вам необходимо добавить ключевое слово static.

Если вы копируете метод из нестатического классав статический класс вы должны удалить ключевое слово static.

Перемещение методов - это основная задача, которую делают разработчики («Мне нужно реорганизовать этот код, это займет как минимум неделю»), исделав это проще, Эрик и его команда позволили нам сэкономить часы работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...