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