В С#, какая разница между
static readonly string MyStr;
и
const string MyStr;
В С#, какая разница между
static readonly string MyStr;
и
const string MyStr;
Когда вы используете строку const
, компилятор вводит строковое значение во время компиляции.
Поэтому, если вы используете значение const
в другой сборке, обновите исходную сборку и измените значение, другая сборка не увидит изменения до тех пор, пока вы не перекомпилируете его.
A static readonly
string - это нормальное поле, которое просматривается во время выполнения. Поэтому, если значение поля изменяется в другой сборке, изменения будут видны сразу после загрузки сборки без перекомпиляции.
Это также означает, что строка static readonly
может использовать непостоянные элементы, такие как Environment.UserName
или DateTime.Now.ToString()
. Строка const
может быть инициализирована только с использованием других констант или литералов.
Кроме того, строка static readonly
может быть установлена в статическом конструкторе; Строка const
может быть инициализирована только внутри строки.
Обратите внимание, что a static string
можно изменить; вы должны использовать static readonly
.
Вот хороший анализ плюсов и минусов:
Таким образом, кажется, что константы следует использовать, когда маловероятно, что значение когда-либо изменится, или если никакие внешние приложения/библиотеки не будут использовать константу. Статические поля только для чтения следует использовать, когда требуется вычисление во время выполнения или если внешние потребители являются фактором.
Быстрый ответ:
public const string MyStr;
константа компиляции (вы можете использовать ее как параметр по умолчанию для параметра метода, например), и она НЕ будет запутана, если вы используете такую технологию
public static readonly string MyStr;
является константой время выполнения, это означает, что она оценивается при запуске приложения, а не раньше. Вот почему он не может использоваться как параметр по умолчанию для метода (ошибка компиляции), например. Сохраненное в нем значение может быть запутано
OQ спросил о static string
vs const
. Оба варианта имеют разные варианты использования (хотя оба они рассматриваются как статические).
Используйте const только для действительно постоянных значений (например, скорости света - но даже это зависит от среды). Причиной этого строгого руководства является то, что значение const заменяется на использование константы в собраниях, которые ссылаются на нее, то есть вы можете иметь проблемы с версией, если const изменится по своему определению (т.е. Он не должен был быть постоянным в конце концов). Обратите внимание, что это даже влияет на поля private const
, потому что у вас может быть база и подкласс в разных сборках и приватные поля унаследованы.
Статические поля привязаны к типу, в котором они объявлены. Они используются для представления значений, которые должны быть одинаковыми для всех экземпляров данного типа. Эти поля могут быть записаны столько раз, сколько вам нравится (если не указано только для чтения).
Если вы имели в виду static readonly
vs const
, то я бы рекомендовал static readonly
для почти всех случаев, потому что это более надежное будущее.
Когда вы используете константную строку, компилятор встраивает строковое значение во время компиляции. Поэтому, если вы используете значение const в другой сборке, затем обновите исходную сборку и измените значение, другая сборка не увидит изменения, пока вы не перекомпилируете его.
Статическая строка только для чтения - это обычное поле, которое ищется во время выполнения. Поэтому, если значение поля изменяется в другой сборке, изменения будут видны, как только сборка будет загружена, без перекомпиляции.
Вы можете изменить значение static readonly string
только в конструкторе static
класса или инициализатора переменной, в то время как вы не можете изменить значение строки const
где угодно.