80 votes

Comment fonctionne un constructeur statique ?

<pre><code></code><p>Voici la séquence dont j’ai assumé</p><ol> <li>Début du constructeur statique</li> <li>Fin du constructeur statique</li> <li>Début de la main</li> <li>Début de MyMethod</li> <li>Fin de main</li> </ol><p>Maintenant dans n’importe quel scénario si 4 débutera avant 2 je suis foutu. Est-ce possible ?</p></pre>

218voto

Eric Lippert Points 300275

Vous seulement posé une question ici, mais il y a une dizaine de questions que vous devez avoir demandé, donc je vais y répondre.

Voici la séquence qui je suppose

  1. Début de constructeur de classe (également connu en tant que cctor)
  2. Fin de cctor
  3. début de la Principale
  4. début de MyMethod

Est-ce correct?

Pas de. La séquence correcte est:

  1. Début de cctor pour le Programme, si il y en a un. Il n'est pas.
  2. Fin de cctor pour le Programme, si il y en a un. Il n'est pas.
  3. Début de la Principale
  4. Début de cctor pour MyClass
  5. Fin de cctor pour MyClass
  6. Début de Maclasse.MyMethod

Que faire si il y a un champ statique de l'initialiseur?

Le CLR est autorisé à changer l'ordre dans lequel un champ statique des initialiseurs d'exécuter dans certains cas. Voir Jon page sur le sujet pour plus de détails:

Les différences entre les constructeurs et le type d'initialiseurs

Est-il possible pour une méthode statique comme MyMethod être appelée avant que le cctor de cette classe est terminée?

Oui. Si le cctor elle-même appelle MyMethod alors évidemment MyMethod sera appelée avant la cctor complète.

Le cctor n'appelle pas MyMethod. Est-il possible pour une méthode statique comme MyMethod être appelée avant que le cctor de MyClass complète?

Oui. Si le cctor utilise un autre type dont cctor appels MyMethod puis MyMethod sera appelée avant la MyClass cctor complète.

Pas de cctors appel MyMethod, directement ou indirectement! Maintenant, il est toujours possible pour une méthode statique comme MyMethod être appelée avant que le cctor de MyClass complète?

Pas de.

Est-ce encore le cas même si il y a plusieurs threads concernés?

Oui. Le cctor va se terminer sur un fil avant la méthode statique peut être appelé de n'importe quel thread.

Peut le cctor être appelé plus d'une fois? Supposons que deux threads à la fois la cause de la cctor à exécuter.

Le cctor est garanti d'être appelé plus d'une fois, peu importe combien de fils sont impliqués. Si deux threads appel MyMethod "en même temps", alors qu'ils course. L'un d'eux perd la course et les blocs jusqu'à ce que le MyClass cctor complète sur le vainqueur de la thread.

La perdre le fil de blocs jusqu'à ce que le cctor est fait? Vraiment?

Vraiment.

Alors que faire si la cctor sur la réussite thread appelle le code qui bloque sur un verrou déjà pris par le perdre le fil?

Ensuite, vous avez un classique de verrouillage de la commande d'inversion de la condition. Votre programme de blocages. Pour toujours.

Cela semble dangereux. Comment puis-je éviter le blocage?

Si ça fait mal quand on le fait alors arrêter de le faire. Ne jamais faire quelque chose qui peut bloquer dans un cctor.

Est-ce une bonne idée de s'appuyer sur cctor de l'initialisation de la sémantique à appliquer complexe exigences en matière de sécurité? Et est-ce une bonne idée d'avoir un cctor qui ne les interactions de l'utilisateur?

Ni sont de bonnes idées. Mon conseil est que vous devez trouver un autre moyen de s'assurer que la sécurité ayant un impact sur les conditions préalables de vos méthodes sont remplies.

24voto

James Michael Hare Points 19077

Selon la MSDN, un constructeur statique:

Un constructeur statique est automatiquement appelée pour initialiser la classe avant la première instance est créée ou tous les membres statiques sont référencé.

Ainsi, le constructeur statique sera appelée avant la méthode statique MyClass.MyMethod() est invoquée (en supposant que pas aussi invoquée au cours de statique de la construction ou un champ statique de l'initialisation de cours).

Maintenant, si vous faites n'importe quoi asynchrone dans cette static constructor, alors c'est votre travail de le synchroniser.

11voto

dasblinkenlight Points 264350

Le #3 est en fait #1 : l’initialisation statique ne démarre pas jusqu'à la première utilisation de la classe à laquelle il appartient.

Il est possible si est appelé depuis le constructeur statique ou un bloc de l’initialisation statique. Si vous ne pas appelez directement ou indirectement de votre constructeur statique, vous devriez être bien.

9voto

ken Points 6183

De la documentation (moi qui souligne) :

Un constructeur statique est appelé pour initialiser la classe avant la première instance est créé automatiquement ou tous les membres statiques sont référencés.

2voto

Scott Chamberlain Points 32782

Vous pouvez garantir 4 viendra toujours après 2 (si vous ne créez pas une instance de votre classe de votre méthode statique), mais ce n’est pas vrai pour 1 et 3.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X