Когда, если вообще, мы должны использовать const? - PullRequest
26 голосов
/ 17 февраля 2009

Const запекается в коде клиента. Readonly нет. Но const быстрее. Хотя может быть только немного.

Вопрос в том, есть ли когда-нибудь сценарий, в котором вы предпочитаете const, а не readonly? Или, если перефразировать, разве нам не лучше всегда лучше использовать readonly вместо const (с учетом вышеупомянутой выпечки)?

Ответы [ 10 ]

29 голосов
/ 17 февраля 2009

Я считаю, что единственное время, когда «const» подходит, это когда спецификация, против которой вы кодируете, более долговечна, чем программа, которую вы пишете. Например, если вы реализуете протокол HTTP, целесообразно иметь константный член для «GET», потому что он никогда не изменится, и клиенты, безусловно, могут жестко запрограммировать его в свои скомпилированные приложения, не беспокоясь о том, что вам придется изменить значение позже.

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

О! И никогда не предполагайте, что const быстрее, чем поле только для чтения, если вы его не измерили. Существуют JIT-оптимизации, которые могут сделать это, так что на самом деле это точно так же.

15 голосов
/ 17 февраля 2009

Const vs readonly :

Краткий обзор различий между const и readonly в C #: 'Const':

  • Не может быть статичным.
  • Значение оценивается в время компиляции.
  • Инициализирован только при объявлении.

'только для чтения':

  • Может быть на уровне экземпляра или статическим.
  • Значение оценивается при времени выполнения.
  • Может быть инициализирован в объявлении или кодом в конструкторе.

Исправление: вышеуказанные состояния const не могут быть статическими. Это неправильно. К ним нельзя применить ключевое слово static, потому что они уже статические.

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

4 голосов
/ 17 февраля 2009

Вы можете использовать значение const в качестве регистра в выражении switch, fwiw.

3 голосов
/ 17 февраля 2009

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

Я предпочитаю readonly для вещей, которые могут потенциально измениться. Таким образом, мне нужно перекомпилировать только одну DLL, если произойдет изменение. Исключением из этого практического правила является то, что переменная является приватной / защищенной / дружественной для своей сборки. В этих случаях безопасно использовать const.

3 голосов
/ 17 февраля 2009

readonly полезно, когда инициализация не прямая.
const можно использовать, когда вы уверены в значении до его компиляции.

В некотором смысле readonly - это время выполнения const, а const - это значение постоянной времени компиляции.

РЕДАКТИРОВАТЬ: Если вы посмотрите на некоторый код, используя www.koders.com, вы обнаружите, что там используется только для чтения, где const мог бы быть использован. Я думаю, причина этого в том, что он может быть изменен в конструкторе (если это необходимо). В случае const (особенно публичного) у вас есть шанс нарушить код клиента в зависимости от вашего кода.

2 голосов
/ 17 февраля 2009

const не может использоваться для классов или структур (за исключением строковых констант и null, как указал г-н Скит), только для типов значений и доступны как статические поля. Значение const устанавливается во время компиляции и должно быть установлено при объявлении.

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

Вот хорошая страница для обзора ключевых слов const, readonly и static.

1 голос
/ 17 февраля 2009

Вы должны отдавать предпочтение модификатору, который тестируется во время компиляции, по сравнению с модификатором, который тестируется во время выполнения (в этом контексте const, а не только для чтения). И вы всегда должны использовать модификаторы, которые поддерживают семантику, которая вам нужна. Если что-то не предназначено для изменения - защитите его, или кто-то напишет что-то (случайно или по незнанию).

0 голосов
/ 26 апреля 2019

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

Используйте readonly поля , когда они инициализируются из другого источника (файл, база данных или другие коды, и т. Д.), Но тогда они не будут изменены.

Используйте поля static readonly, когда вы хотите сделать их общими для всех экземпляров .

0 голосов
/ 17 февраля 2009

Хорошее использование const для ключей пар ключ / значение. Например, если вы все еще используете AppSetting (вместо ApplicationSettings), на самом деле не имеет смысла загружать имя ключа для параметра конфигурации. Если он используется в нескольких местах, вставьте Ключ в const.

0 голосов
/ 17 февраля 2009

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

...