Votre code comprend une instance initialisée statique privé:
private static Foo instance = new Foo();
Vous présumez que cela signifie que la instance de constructeur aura toujours courir avant l'accès à toute méthode statique, assurant ainsi bar
a été initialisé?
Dans le cas d'un seul filetage, je pense que vous avez raison.
La séquence des événements serait:
- Appel à
Foo.BarLength()
- initialisation statique de classe
Foo
(si pas déjà terminé)
- d'initialisation statique de membre statique privé
instance
avec instance de Foo
- Entrée à
Foo.BarLength()
Toutefois, l'initialisation statique d'une classe est uniquement déclenchée une fois par App Domain - et IIRC il n'y a aucun blocage pour s'assurer que est complété avant d'appeler d'autres méthodes statiques.
Donc, vous pourriez avoir ce scénario:
- Discussion Alpha: Appel à
Foo.BarLength()
- Discussion Alpha: L'initialisation statique de classe
Foo
(sinon déjà terminé) commence
- Context Switch
- Thread Beta: Appelez à
Foo.BarLength()
- Thread Beta: Aucun appel à l'initialisation statique de classe
Foo
parce que c'est déjà en cours
- Discussion Beta: Entrée
Foo.BarLength()
- Discussion Beta: L'accès à
null
membre statique instance
Il n'y a aucun moyen de l'analyseur de contrats peut savoir que vous ne lanceriez jamais le code d'une manière multithread, donc il doit pécher par excès de prudence.
hors sujet, mais pourriez-vous me dire ce thème visual studio que vous utilisez? – Justin
@Justin: juste le thème par défaut vs2010 avec mon propre schéma de couleur de texte personnalisé (voir la publication éditée). Pourquoi demandes-tu? – dtb
Je viens de chercher à changer mon propre schéma de couleurs de studio visuel récemment et vraiment comme le vôtre. Je me demandais si vous l'aviez téléchargé quelque part. – Justin