2009-08-17 10 views
11

W tym fragmencie:C#: Czy to przypisanie pola jest bezpieczne?

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

    ... 

} 

Czy istnieje ryzyko kończąc ConstantB == "Else"? Czy zadania są wykonywane liniowo?

+0

@Svish, patrz komentarz Jon Skeet na jego odpowiedź –

+0

@Nathan, dzięki, nie zauważyłem tego: p – Svish

Odpowiedz

37

zawsze dostanie "somethingelse". Dzieje się tak dlatego, że ConstantB zależy od ConstantA.

Możesz nawet przełączać linie, a otrzymasz taki sam wynik. Kompilator wie, że ConstantB zależy od ConstantA i odpowiednio je obsłuży, nawet jeśli napiszesz je w klasach częściowych.

Aby być całkowicie pewnym, można uruchomić wiersz polecenia VS i wywołać funkcję ILDASM. Tam możesz zobaczyć rzeczywisty skompilowany kod.

Dodatkowo, jeśli starają się wykonać następujące czynności otrzymasz błąd kompilacji:

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

błąd: Ocena stałej wartości dla „ConsoleApplication2.Program.ConstantB” obejmuje okrągły definicji Ten rodzaj udowadnia, że ​​kompilator zna swoje zależności.


Dodano: Spec odniesienia podkreślił 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

Tak, ty "w porządku - doh! :) Próbuję znaleźć bit w specyfikacji, który gwarantuje to ... –

+0

Znalazłem go teraz - rozdział 10.4. –

+3

Zmieniono moją odpowiedź, więc przynajmniej nie zamierzam wprowadzać w błąd ludzi, ale usunę to, jeśli/kiedy będę mógł. –

3

ten ciąg konkatenacja dzieje się w czasie kompilacji, ponieważ istnieją tylko ciągi literały (wyszukiwanie stałe składanie w literaturze konstrukcji kompilatora).

Nie martw się tym.

2

Należy zawsze oceniać na "somethingelse"