Réponses
Trop de publicités?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
- Début de constructeur de classe (également connu en tant que
cctor
) - Fin de cctor
- début de la Principale
- début de MyMethod
Est-ce correct?
Pas de. La séquence correcte est:
- Début de cctor pour le Programme, si il y en a un. Il n'est pas.
- Fin de cctor pour le Programme, si il y en a un. Il n'est pas.
- Début de la Principale
- Début de cctor pour MyClass
- Fin de cctor pour MyClass
- 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.
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.
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.
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.