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

Когда, если когда-либо, мы должны использовать const?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Const vs readonly:

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

EDIT: если вы посмотрите на какой-то код с помощью www.koders.com, вы обнаружите, что есть использование readonly, где const мог использоваться. Я думаю, причина в том, что это может быть изменено в конструкторе (если нужно). Если const (особенно публичный), у вас есть шанс разбить клиентский код, зависящий от вашего кода.

Ответ 5

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

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

Ответ 6

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

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

Здесь хорошая страница для обзора константных, статических и статических ключевых слов.

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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