Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

Ричард,

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

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

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

Приветствия. Кит.

Ответ 5

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

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

Ответ 6

Явное кодирование делает вещи поддерживаемыми

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

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

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

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

Ответ 7

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

Ответ 8

Это связано с тем, что copy-paste будет более сложным.

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

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

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