2009-08-17 10 views
11

In diesem Snippet:C#: Ist diese Feldzuweisung sicher?

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

    ... 

} 

Gibt es ein Risiko, mit ConstantB == "Else" enden? Oder laufen die Aufgaben linear ab?

+0

@Svish, bitte Jon Skeet Kommentar zu seiner Antwort –

+0

@Nathan sehen, danke, hatte dies nicht bemerkt: p – Svish

Antwort

37

Sie erhalten „somethingelse“ immer. Dies liegt daran, dass ConstantB von ConstantA abhängt.

Sie können sogar die Leitungen wechseln, und Sie erhalten das gleiche Ergebnis. Der Compiler weiß, dass ConstantB von ConstantA abhängt und es entsprechend behandelt, auch wenn Sie es in Teilklassen schreiben.

Um ganz sicher zu sein, können Sie VS Eingabeaufforderung ausführen und ILDASM aufrufen. Dort können Sie den tatsächlich kompilierten Code sehen.

Außerdem, wenn Sie versuchen, das zu tun, folgende Sie einen Compiler-Fehler erhalten werden:

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

Fehler: Die Auswertung des konstanten Wert für ‚ConsoleApplication2.Program.ConstantB‘ beinhaltet eine zirkuläre Definition Diese Art von beweist, dass der Compiler seine Abhängigkeiten kennt.


Hinzugefügt: Spec Referenz von Jon Skeet wies darauf hin:

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

Yup, Sie hast recht - doh! :) Versuchen, das Bit in der Spezifikation zu finden, die dies garantiert ... –

+0

Jetzt gefunden - Abschnitt 10.4. –

+3

Bearbeitete meine Antwort so, dass es zumindest keine Leute in die Irre führt, aber wenn ich kann, werde ich es löschen. –

3

Diese String-Verkettung passiert zur Kompilierungszeit, da nur String-Literale vorhanden sind (Suche nach Konstantenfaltung in Compiler-Konstruktionsliteratur).

Mach dir keine Sorgen.

2

Es sollte immer bewerten zu „somethingelse“