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

В чем разница между Const и Static в С#?

Я очень хочу знать разницу между константной переменной и статической переменной.

Насколько я знаю, константа также является статической и не может быть доступна для переменной экземпляра, такой же, как статическая, тогда в чем разница между ними?

Пожалуйста, объясните...

4b9b3361

Ответ 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

Константа - это переменная, которая не может быть изменена в значении.

Статичность - это переменная, которая не может использоваться вне области ее объявления. То есть, если это глобальная переменная, то она может использоваться только в объявляемом файле. Если это переменная внутри функции, ее можно использовать только внутри этой функции.