С#: Безопасно ли это назначение полей?

В этом фрагменте:

class ClassWithConstants
{
    private const string ConstantA = "Something";
    private const string ConstantB = ConstantA + "Else";

    ...

}

Есть ли риск оказаться с ConstantB == "Else"? Или ли настройки выполняются линейно?

Ответ 1

Вы всегда получите "SomethingElse". Это связано с тем, что ConstantB зависит от ConstantA.

Вы можете даже переключать линии, и вы получите тот же результат. Компилятор знает, что ConstantB зависит от ConstantA и будет обрабатывать его соответственно, даже если вы напишете его в частичных классах.

Чтобы быть уверенным, вы можете запустить VS Command Prompt и вызвать ILDASM. Там вы можете увидеть фактический скомпилированный код.

Кроме того, если вы попытаетесь сделать следующее, вы получите ошибку компиляции:

private const string ConstantB = ConstantA + "Else";
private const string ConstantA = "Something" + ConstantB;

Ошибка. Оценка постоянного значения для ConsoleApplication2.Program.ConstantB включает в себя круговое определение Это доказывает, что компилятор знает свои зависимости.


Добавлено: Ссылка на спецификацию, отмеченная Jon Skeet:

Это прямо указано в разделе 10.4 спецификации С# 3: Константам разрешено зависеть от других констант в рамках одной и той же программы, если зависимости не имеют кругового характера. Компилятор автоматически упорядочивает вычисления константных объявлений в соответствующем порядке.


Ответ 2

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

Не беспокойтесь об этом.

Ответ 3

Он всегда должен оценивать значение "SomethingElse"