Почему C # не позволяет использовать const и static в одной строке? - PullRequest
24 голосов
/ 09 мая 2009

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

Я делаю еще одно различие в том, что в Java каждый интерфейс является публичным и абстрактным независимо от того, объявлено это явно или нет. Разве const не является статичным по своей природе? Почему C # отказывается от этого?

Ответы [ 5 ]

41 голосов
/ 09 мая 2009

const и static действительно означают разные вещи, разные механизмы хранения, разные инициализации. статический предназначен для чтения / записи, поэтому должен иметь память, выделенную для хранения, и должен быть инициализирован во время выполнения. static может быть инициализировано литеральным значением или выражением. Напротив, const является неизменным и должен быть инициализирован с постоянной времени компиляции (обычно литеральное значение или выражение, которое может быть полностью оценено во время компиляции). Это значение известно во время компиляции, поэтому оно может быть встроено непосредственно в сгенерированный код, поэтому не требует выделения памяти во время выполнения.

22 голосов
/ 09 мая 2009

Константы по своей природе являются статическими, поэтому они будут избыточными.

9 голосов
/ 16 апреля 2010

Как уже было сказано, static final в Java совпадает с static readonly в C #. На самом деле, вы говорите, что этот член статический и его содержимое не может быть изменено. Также вы можете указать в обоих случаях значение из статического конструктора.

Но const в C # - это совсем другое. Это больше похоже на константы в C (директивы DEFINE ), но с учетом ООП. Это статично, потому что это константа - каждый экземпляр будет иметь эту константу с одинаковым значением, никакой конструктор не сможет ее установить. Также возможно, что кто-то хотел бы получить доступ к константе, не создавая экземпляр. Когда вы думаете об этом, нестатическая константа просто не имеет смысла. Вы можете почти сказать, что константы не являются частью объекта - они просто используют его для предоставления контекста, строгого имени.

Java не имеет эквивалента const . Вы можете где-нибудь прочитать, что static final эквивалентно DEFINE , но это так расплывчато. Абсолютно другой механизм, ничего общего, но в конечном итоге в коде то же самое - лучшая ремонтопригодность и читаемость кода.

Вам просто нужно перестать думать о константах в C # как о статических членах, потому что это не так. Думайте о них как оОП версия DEFINE . Когда вы рассматриваете инкапсуляцию, единственная причина, по которой поля final и readonly , состоит в том, чтобы предотвратить случайное изменение своего кода собственным значением. И мне это не кажется постоянным.

Sumary:

  • final = только для чтения
  • static final = static readonly
  • N / A = const
3 голосов
/ 09 мая 2009

Это правда, что C # const подразумевает static НО, C # имеет ключевое слово final в ключевом слове *. 1009 * * 1011 только для чтения *.

Так, на самом деле, C # допускает const final , это static readonly в C #.

2 голосов
/ 09 мая 2009

Потому что допустимые и не требующие присущие им модификаторы могут вызвать путаницу. Если вы видите

static const int A = 3
const int B = 5

Вы можете верить, что это 2 разных вида констант.
Даже VB 2008 (который может быть очень многословным, если хотите) не позволяет этого.

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