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

Почему С# не разрешает const и static в одной строке?

Почему С# не разрешает const и static в одной строке? В Java вы должны объявить поле как "статический" и "final", чтобы действовать как константа. Почему С# не позволяет объявлять const как final?

Я делаю дальнейшее различие, что в Java каждый интерфейс является общедоступным и абстрактным, независимо от того, явно ли это объявлено или нет. Не являются ли константы статичными по своей природе? ПОЧЕМУ С# balk на этом?

4b9b3361

Ответ 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 (который может быть очень многословным, если вы пожелаете) не позволяет этого.