Const string vs. static readonly string в С#

В С#, какая разница между

static readonly string MyStr;

и

const string MyStr;

Ответ 1

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

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

Это также означает, что строка static readonly может использовать непостоянные элементы, такие как Environment.UserName или DateTime.Now.ToString(). Строка const может быть инициализирована только с использованием других констант или литералов.
Кроме того, строка static readonly может быть установлена ​​в статическом конструкторе; Строка const может быть инициализирована только внутри строки.

Обратите внимание, что a static string можно изменить; вы должны использовать static readonly.

Ответ 2

Вот хороший анализ плюсов и минусов:

Таким образом, кажется, что константы следует использовать, когда маловероятно, что значение когда-либо изменится, или если никакие внешние приложения/библиотеки не будут использовать константу. Статические поля только для чтения следует использовать, когда требуется вычисление во время выполнения или если внешние потребители являются фактором.

Ответ 3

Быстрый ответ:

public const string MyStr; 

константа компиляции (вы можете использовать ее как параметр по умолчанию для параметра метода, например), и она НЕ будет запутана, если вы используете такую ​​технологию

public static readonly string MyStr;

является константой время выполнения, это означает, что она оценивается при запуске приложения, а не раньше. Вот почему он не может использоваться как параметр по умолчанию для метода (ошибка компиляции), например. Сохраненное в нем значение может быть запутано

Ответ 4

OQ спросил о static string vs const. Оба варианта имеют разные варианты использования (хотя оба они рассматриваются как статические).

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

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

Если вы имели в виду static readonly vs const, то я бы рекомендовал static readonly для почти всех случаев, потому что это более надежное будущее.

Ответ 5

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

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

Ответ 6

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