2014-04-08 8 views
7

die folgende Klasse:Seltsames Verhalten auf statischen Mitgliedern einer Klasse - Wie ist das möglich? Betrachten

public class MyClass 
{ 
    public static string[] SomeAmazingConsts = { Const1 }; 
    public static string Const1 = "Constant 1"; 
    public static string Const2 = "Constant 2"; 
} 

Nun Besuche die Nutzung:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] s = MyClass.SomeAmazingConsts; 
     //s[0] == null 
    } 
} 

Das Problem ist, dass s [0] == null! Wie zum Teufel passiert das? Ordnen Sie nun die statische Variable von MyClass wie folgt neu an:

public class MyClass 
{ 
    public static string Const1 = "Constant 1"; 
    public static string Const2 = "Constant 2"; 
    public static string[] SomeAmazingConsts = { Const1 }; 
} 

Dinge beginnen ordnungsgemäß zu funktionieren. Wer kann das beleuchten?

+0

Sie sind ein NULL-Verweis auf das Array zuweisen, ist es nicht auf magische Weise mit Wieder zugewiesen bekommen können der modifizierte Wert – jedgard

Antwort

11

Von 10.4.5.1 Static field initialization

Die statische Feld Variableninitialisierungen einer Klasse zu einer Folge von Zuweisungen entsprechen, die in der Text Reihenfolge in ausgeführt werden, die sie in der Klassendeklaration erscheinen.

So ist die Initialisierung geschieht von oben nach unten, und im ersten Fall Const1 nicht initialisiert wurde, daher der null

+0

Also, warum der Compiler mich nicht bei "public static string [] SomeAmazingConsts = {Const1};" Linie? Da Const1 eine statische Variable ist und noch nicht initialisiert ist, könnten sie (?) Mich davon abhalten, sie zu benutzen, bevor sie überhaupt definiert wurde. Übrigens, wie kann ich sicherstellen, dass die Neuanordnung keinen Einfluss auf die Ausführung des Codes hat? Irgendein Rat? –

+0

Ich benutze ReSharper, und die Nachricht (sei es nur Warnung) states * Statisches Feld Initialisierer bezieht sich auf statische Feld unter oder in anderen Teil *. Sie sollten also eher ein Codeanalyse-Tool in Betracht ziehen? Außerdem ist Ihre Variable im richtigen Bereich definiert, sie wird gerade nicht initialisiert. –

+0

Eine offensichtliche Lösung ist das String-Array als Eigenschaft deklarieren: public static string [] SomeAmazingConsts {get {return new string [] {Const1}; }} Aber ist es in Ordnung, das zu tun? –