2009-08-17 6 views
11

В этом фрагменте:C#: Безопасно ли это полевое назначение?

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

    ... 

} 

Есть ли риск в конечном итоге с ConstantB == "Else"? Или ли периодические решения происходят линейно?

+0

@Svish, пожалуйста, смотрите комментарии Джона Скита на его ответ –

+0

@ Натан, спасибо, что не заметил этого: р – Svish

ответ

37

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

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

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

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

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

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


Добавлено: Spec Ссылка указал Jon Skeet:

This is explicitly mentioned in section 10.4 of the C# 3 spec: Constants are permitted to depend on other constants within the same program as long as the dependencies are not of a circular nature. The compiler automatically arranges to evaluate the constant declarations in the appropriate order.


+2

Да, вы «Правильно - да! :) Попытка найти бит в спецификации, который гарантирует это ... –

+0

Нашел его сейчас - раздел 10.4. –

+3

Отредактировал мой ответ, так что, по крайней мере, он не собирается вводить в заблуждение людей, но удалит его, если/когда смогу. –

3

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

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

2

Всегда следует оценить на "SomethingElse"

 Смежные вопросы

  • Нет связанных вопросов^_^