2009-12-22 6 views
0

est ici un morceau de mon code:Quand les déclarations statiques sont-elles exécutées?

public class MyClass { 
    public object Value { get; set; } 

    public MyClass(object value) { 
    this.Value = value; 
    } 
} 

public class AnotherClass { 
    private static MyClass _MyObj = new MyClass(new object()); 

    public static void Main(string[] args) { 
    var x = _MyObj; // no problem 
    var y = x.Value; // no problem 
    var z = y.ToString(); // Null ref exception 
    } 
} 

Je ne comprends pas comment cela peut être. _MyObj n'est pas nul, ce qui signifie que l'affectation en ligne a bien fonctionné, mais _MyObj.Value est nul, ce qui signifie que le code du constructeur n'a pas été invoqué! Il y a de la magie noire à l'œuvre ici, et j'apprécierais grandement une explication.

Merci!

EDIT - Désolé pour le non repro. Mon code réel est (évidemment) plus complexe que celui-ci, donc j'ai essayé de le bousculer, et évidemment dans le processus j'ai dû enlever une autre obstruction à la fonction propre du code. Mais Kobi's answer est vraiment ce que j'essayais de sortir de cette question, de toute façon - alors répondez crédit à lui. :)

+2

Ce code ne sera même pas compilé, car vous n'avez pas de setter pour la propriété Value. –

+0

Quel compilateur? Fonctionne bien sous VS2008/.NET3.5 dès que j'ajoute un setter pour la propriété Value. –

+2

De toute façon, il y a peu à ajouter à http://stackoverflow.com/questions/1405709/what-is-the-static-variable-initialization-order-in-c – Kobi

Répondre

2

La bonne façon d'initialiser les membres statiques est en utilisant un static constructor:

static AnotherClass(){ 
    _MyObj = new MyClass(new object()); 
} 
+1

C'est un problème de style, votre code est exactement le même que 'private MyClass _MyObj = new MyClass (nouvel objet());' –

+0

@Henk - Je m'en rends compte, mais cela peut encore aider dans un scénario plus complexe, comme l'a dit Shaul. – Kobi

1

Mettez un setter et il fonctionnera comme prévu:

public object Value { get; set; } 
2

Statut: Non repro.

L'exemple de code fourni ne compile pas, public object Value { get; } n'est pas une propriété automatique valide. Après la correction avec private set;, il compile et s'exécute sans erreur.

Questions connexes