Почему С# не разрешает const и static в одной строке?
Почему С# не разрешает const и static в одной строке? В Java вы должны объявить поле как "статический" и "final", чтобы действовать как константа. Почему С# не позволяет объявлять const как final?
Я делаю дальнейшее различие, что в Java каждый интерфейс является общедоступным и абстрактным, независимо от того, явно ли это объявлено или нет. Не являются ли константы статичными по своей природе? ПОЧЕМУ С# balk на этом?
Ответы
Ответ 1
const и static действительно означают разные вещи, разные механизмы хранения, различную инициализацию. Статический - это чтение/запись, поэтому для хранения требуется память, которая должна быть инициализирована во время выполнения. A static может быть инициализирован с литеральным значением или выражением. Напротив, const является неизменным и должен быть инициализирован с постоянной времени компиляции (обычно это буквальное значение или выражение, которое может быть полностью оценено во время компиляции). Значение известно во время компиляции, поэтому оно может быть встроено непосредственно в сгенерированный код, поэтому не требует, чтобы хранилище не было распределено во время выполнения.
Ответ 2
Константы по своей природе являются статическими, поэтому они будут излишними.
Ответ 3
Как уже говорилось, статический окончательный в Java такой же, как статический readonly в С#. Фактически, вы говорите, что этот член статичен, и его содержимое не может быть изменено. Также вы можете указать в обоих случаях значение из статического конструктора.
Но const в С# это совершенно другая вещь. Это больше по строкам констант в директивах C (DEFINE), но с учетом ООП. Он статический, потому что он постоянный - каждый экземпляр имеет эту константу с тем же значением, ни один конструктор не может ее установить. Также возможно, что кто-то хотел бы получить доступ к константе без необходимости создания экземпляра. Когда вы думаете об этом, нестатическая константа просто не имеет смысла. Вы можете почти сказать, что константы не являются частью объекта - они просто используют его для обеспечения контекста, сильного имени.
Java не имеет эквивалента const. Вы можете где-то прочитать, что статический окончательный эквивалентен DEFINE, но это так расплывчато. Совершенно другой механизм, ничего общего, но в итоге результат в коде тот же - улучшенная ремонтопригодность и читаемость кода.
Вам просто нужно перестать думать о константах в С# как о статических членах, потому что их нет. Подумайте о них как о OOP версии DEFINE. Если вы рассматриваете инкапсуляцию только для полей final и readonly, чтобы ваш собственный код случайно не изменил его значение. И это не кажется мне постоянным.
Sumary:
- final = readonly
- static final = static readonly
- N/A = const
Ответ 4
Верно, что С# const подразумевает статический, но С# имеет эквивалентно ключевому слову Java final в ключевом слове readonly.
Итак, на самом деле, С# допускает const final, он является статическим readonly в С#.
Ответ 5
Потому что разрешение и отсутствие требующих модификаторов может вызвать путаницу. Если вы видите
static const int A = 3
const int B = 5
вы можете поверить, что это 2 разных типа констант.
Даже VB 2008 (который может быть очень многословным, если вы пожелаете) не позволяет этого.