В чем разница между Const и Static в С#?
Я очень хочу знать разницу между константной переменной и статической переменной.
Насколько я знаю, константа также является статической и не может быть доступна для переменной экземпляра, такой же, как статическая, тогда в чем разница между ними?
Пожалуйста, объясните...
Ответы
Ответ 1
const
поля могут содержать только типы значений или System.String
. Они должны быть неизменными и разрешимыми во время компиляции.
static readonly
поля могут и обычно содержать ссылочные типы, которые (кроме строк) могут создаваться только во время выполнения. Они могут (но не должны) быть изменяемыми типами; единственное, что не может измениться, - это сама ссылка.
Если вам нужно поддерживать "постоянный" набор экземпляров, которые являются ссылочными типами, вы обычно делаете это с помощью набора полей public static readonly
, таких как члены System.Drawing.SystemColors.
И последнее, но не менее важное: инициализация поля readonly
может быть отложена до выполнения конструктора, а это значит, что даже если он может быть написан только один раз, его не всегда нужно инициализировать с помощью точного одинаковое значение. Истинные константы, объявленные с помощью const
, могут иметь только одно значение (указанное во время компиляции).
Ответ 2
Одно тонкое, но решающее различие заключается в том, что consts
оцениваются во время компиляции, тогда как statics
оцениваются во время выполнения. Это оказывает существенное влияние на управление версиями. Например, предположим, что вы пишете:
public const int MaxValue = 100;
Вы собираете и отправляете свою сборку (сборка А). Затем кто-то пишет сборку (сборка B), которая ссылается на MaxValue. В этом случае значение 100 будет скомпилировано в их сборку, а также на ваш.
Если вы написали это:
public static readonly int MaxValue = 100;
тогда ссылка в их сборке осталась бы именно такой, ссылкой. Когда кто-то запустил сборку B, значение 100 будет загружено из вашей сборки, Assembly A.
Это может, например, повлиять на простые сценарии исправления. Если вы выпустили обновленную сборку A, где MaxValues объявлено как 200, и пользователь копирует эту версию по сравнению с предыдущей версией (но не перекомпилирует сборку B), то в первом сценарии Assembly B будет продолжать работать так, как если бы MaxValues составляли 100, потому что это значение const
, которое было скомпилировано в сборку B. Во втором сценарии Assembly B получит новое значение, потому что оно загружает переменную non-const static
во время выполнения.
Ответ 3
Как вы говорите, и static, и const привязаны к типу, а не к экземпляру типа. Тем не менее, вы все равно можете изменять статические элементы. Вы не можете изменять объекты const.
Будьте осторожны с этим. Если ваш объект const является ссылочным типом, назначенное выражение должно быть оценено во время компиляции, а это означает, что единственное возможное значение, которое вы можете дать ссылку, - null
(с заметным и полезным исключением строк).
Ответ 4
A (не-readonly) static может быть изменен после того, как он был объявлен, тогда как константа не может. Кроме того, константу нельзя установить с помощью функции, тогда как статическая переменная может.
Ответ 5
Константа - это переменная, которая не может быть изменена в значении.
Статичность - это переменная, которая не может использоваться вне области ее объявления. То есть, если это глобальная переменная, то она может использоваться только в объявляемом файле. Если это переменная внутри функции, ее можно использовать только внутри этой функции.