2010-11-12 8 views
3

Le code suivant n'appelle pas le constructeur statique de classe. Est-ce un bug ou une fonctionnalité?C# problème de constructeur statique

class Test 
{ 
    static Test 
    { 
     //do stuff 
    } 
    public static AnotherClass ClassInstance { get; set; } 
} 

class Program 
{ 
    public static void Main() 
    { 
     var x = Test.ClassInstance; 
    } 
} 

Je n'ai pas de compilateur pour le moment, mais c'est ce qui m'est arrivé aujourd'hui. Le constructeur statique n'est jamais appelé, mais il est appelé lorsque ClassInstance est un champ à la place. Je comprends que le constructeur statique est appelé lorsque la première instance est créée ou qu'un champ est accédé. N'y a-t-il pas un champ derrière la propriété implémentée automatiquement?

Je cherche une explication sur pourquoi la propriété ne déclenche pas de constructeur statique quand la propriété est implémentée comme deux fonctions et un champ. C'est tout à fait illogique pour moi et c'est pourquoi j'ai pensé que ça pourrait être un bug.

+1

Je viens compilé et a couru votre code. Le constructeur statique est appelé. –

+0

@Joe quel cadre ciblez-vous? – Simone

+0

@Simone J'ai essayé de cibler chaque framework disponible dans VS2010 (à savoir 2.0 et supérieur) et ça fonctionne de la même manière dans tous les cas. –

Répondre

1

Les constructeurs statiques sont invoqués la première fois qu'une instance d'une classe est créée ou lorsqu'un membre statique est référencé. Donc, la première fois que vous créez une instance de Test ou lorsque la propriété ClassInstance est référencée, c'est quand votre constructeur statique sera appelé.

Vous voulez en savoir plus? - http://msdn.microsoft.com/en-us/library/k9x6w0hc(VS.80).aspx

+0

s'il vous plaît voir ma modification. – leiz

1

constructeur statique est appelé lorsqu'un membre statique est accessible ou instance est créée

class Program 
{ 
    static void Main(string[] args) 
    { 
     A.SomeField = new B(); 
    } 
} 

class A 
{ 
    static A() 
    { 
     Console.WriteLine("Static A"); 
    } 

    public static B SomeField { get; set; } 
} 

class B 
{ 
    static B() 
    { 
     Console.WriteLine("Static B"); 
    } 
} 

Résultat:

Static B 
Static A 

Comme vous le voyez - il n'y a pas « statique B » dans le résultat

+0

s'il vous plaît voir ma modification. – leiz

+0

@leiz: bien sûr, il y a un champ et 2 méthodes générées automatiquement, mais en quoi cela est-il lié au constructeur statique? : -S – zerkms

+0

L'exemple n'explique pas vraiment ce que je demandais. B n'est jamais accessible donc le contructor statique n'est pas appelé. – leiz

0

Le constructeur statique est appelé automatiquement avant la création de la première instance ou tout membre statique est référencé.

plus d'informations de Msdn.

+0

s'il vous plaît voir mon edit. – leiz

1

J'ai vérifié le même comportement, mais si vous modifiez le code comme ceci:

class AnotherClass {} 

class Test 
{ 
    static Test() 
    { 
     Console.WriteLine("Hello, world!"); 
    } 

    public static AnotherClass ClassInstance { get { return new AnotherClass(); } } 

} 

class Program 
{ 
    public static void Main() 
    { 
     var x = Test.ClassInstance; 
    } 
} 

il écrit: "Bonjour, monde!" ...

Questions connexes