2009-08-17 18 views
11

:C#: Bu alan ataması güvenli midir? Bu pasajda

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

    ... 

} 

ConstantB == "Else" ile biten bir riski var mı? Ya da ödevler doğrusal mı gerçekleşiyor? Yalnızca dize hazır (derleyici inşaat literatürde sabit katlanması aramak) olduğundan

+0

@Svish, onun cevabını –

+0

@Nathan Jon Skeet yorumuna bakın, teşekkürler, bu fark etmemişlerdi: p – Svish

cevap

37

değerlendirmelidir Her zaman "olarak başka şeyler" alacak. Bunun nedeni, ConstantB'nin ConstantA'ya bağlı olması.

Hatta hatta geçiş yapabilir ve aynı sonucu alırsınız. Derleyici, ConstantB'nin ConstantA'ya bağlı olduğunu ve bunu kısmi sınıflarda yazmış olsanız bile buna uygun olarak kullanacağını bilir.

Tam olarak emin olmak için VS Komut İstemi'ni çalıştırabilir ve ILDASM'i arayabilirsiniz. Orada gerçek derlenmiş kodu görebilirsiniz.

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

Hata: Eğer bir derleme hatası alırsınız aşağıdakileri yapın denerseniz

Ek olarak, 'ConsoleApplication2.Program.ConstantB' için sabit bir değere değerlendirilmesi dairesel tanımını içerir Bu tür derleyicinin bağımlılığını bildiğini kanıtlar.


Eklendi: Spec referans Jon Skeet tarafından işaret:

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

Evet, sen Haklısın - doh! :) Bunu garanti eden spec içinde biraz bulmaya çalışıyorum ... –

+0

Şimdi bulundu - bölüm 10.4. –

+3

Cevabımı düzenledim, bu yüzden en azından insanları yanlış yönlendirmeyecek, ancak yapabildiğim zaman onu sileceğim. –

3

bu dize birleştirme derleme sırasında gerçekleşir.

bu konuda endişelenmeyin.

2

Her zaman için "olarak başka şeyler"