Объявление локальной переменной как const - PullRequest
7 голосов
/ 29 июня 2010

Очевидно, что объявление локальной переменной как const предотвращает изменение во время выполнения.Const переменные экземпляра являются статическими (я считаю).Имеет ли это какое-либо отношение к природе и использованию const локальных переменных?(например, многопоточность)

Ответы [ 7 ]

16 голосов
/ 29 июня 2010

A const не является переменной, поэтому она называется константой.

11 голосов
/ 29 июня 2010

«const» переменные должны иметь примитивный тип (например, int, bool).Всякий раз, когда в исходном коде появляется переменная «const» (локальная или глобальная), этот экземпляр заменяется самим значением const.Итак:

const int foo = 42;
return foo + 69;

после оптимизации становится:

return 42 + 69

или, скорее:

return 111;

Нет проблем с потоками, потому что переменные const имеют примитивные типы, и они толькосуществует во время компиляции.

9 голосов
/ 29 июня 2010

Константа не является переменной и фактически нигде не хранится.Поскольку он не сохраняется, он не является членом экземпляра и не является статическим.

Константа - это просто имя для значения.Когда код компилируется, значение вставляется туда, где используется константа.(Это имеет значение, если вы используете константу, объявленную в другой сборке. Изменение объявленного значения константы не изменит используемого значения, пока вы не перекомпилируете код, который использует константу.)

Итак, константаобъявленный локально работает точно как константа, объявленная где-то еще, отличается только область действия.

2 голосов
/ 16 мая 2014

Мне нужно вмешаться, чтобы сказать, что я чувствую, что уже достигнутые консенсусные ответы неполны.

Взяв на себя смелость обобщить эти ответы, мы пришли к выводу, что мы должны рассмотреть следующий код, чтобы НЕ БЫТЬ объявлением переменной, а скорее своего рода объявлением макроса, где компилятор вставляет значение const везде, где используется идентификатор:

const int foo = 42;

Однако этот ответ обходит вопросы, которые возникают, если const «переменная» объявляется с использованием (возможно, сложного) константного выражения, такого как следующее:

const double H = 1.23e-2, Q = 7.65e-4, nu = 0.3;
const double Reynolds = H*H*H*H / Q / (1d - nu);

В таком случае имеет значение, будет ли компилятор вычислять выражение один раз и «сохраняет» результат для повторного использования (например, статическая переменная), или он выполняет выражение каждый раз, когда используется идентификатор (например, макрос #define в C / C ++).

В моих собственных поисках я нашел следующее описание в http://www.techopedia.com/definition/3768/constant-c, в котором говорится об этой проблеме:

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

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

8.5.2 Локальные постоянные объявления

A объявление локальной константы объявляет одну или несколько локальных констант.

локальная постоянная декларация:

const type {константа-декларатор,} константа-декларатор

постоянная описатель:

идентификатор = константа-выражение

И

7.19 Постоянные выражения

A константное выражение - это выражение, которое может быть полностью оценено во время компиляции.

постоянное выражение:

выражение

...

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

Любые отзывы об этом "кванзере" приветствуются: ^)

1 голос
/ 29 июня 2010

Основным преимуществом локального использования const является то, что вы случайно не устанавливаете идентификатор на другое значение, которое может изменить правильность вашего кода.

1 голос
/ 29 июня 2010

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

AFAIK создает локальные переменные как const в c # won '• не создавайте какую-либо переменную или поле, но вместо этого назначенное значение константы будет помещено в строку везде, где вы используете его внутри метода.

0 голосов
/ 09 сентября 2013

Я также опубликовал это на Почему я не могу объявить константу, используя var в C #?

Константы без var:

const int Value1 = 1;
const int Value2 = 2;

Константы с var (значения свойств анонимного типа не могут быть изменены после создания):

var constants = new { 
  Value1 = 1, 
  Value2 = 2,
};
//use as constants.Value1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...