DépendencyProperty.adOdowner MSDN Page offre un exemple avec deux Les classes avec des membres statiques et le membre d'une classe dépend du membre de l'autre classe d'initialisation. Je pense que MSDN est faux - l'ordre d'initialisation des variables statiques n'est pas fiable en C # Tout comme c'est en C ++ ou ailleurs. Je suis probablement faux parce que la bibliothèque WPF elle-même est écrite de cette façon et cela fonctionne très bien. Qu'est-ce que je rate? Comment C # Compiler peut-il connaître l'ordre d'initialisation sûr? P>
3 Réponses :
C'est bien pour qu'un type dépend d'un autre type étant initialisé, tant que vous ne vous retrouvez pas dans un cycle.
En gros, c'est bien: P>
public class Child
{
public static readonly int Nasty = Parent.Y;
public static readonly int X = 10;
}
public class Parent
{
public static readonly int Y = Child.X;
}
Merci pour votre brève apparition, le plus saint.
P.s. Votre première version postale avait des informations utiles. Ramenez-le s'il vous plaît?
@New en ville: c'était utile mais pas pertinent. L'ajoutera comme un sous-note.
Jon, vos deux groupes de nombres sont identiques - 0, 10, 10. Pourriez-vous corriger s'il vous plaît? Je ne suis pas non plus clair sur la séquence des événements - qu'entendez-vous par "transporte sans distinction"? Qui comporte exactement sur? Pourriez-vous décrire le processus étape par étape?
Donc, dans C #, toutes les variables statiques ont-elles une initialisation sur la première utilisation de l'idiome d'utilisation automatiquement et de manière transparente par le CLR?
@Jon Skeet: Maintenant, je comprends. Merci beaucoup.
@Cannibalsmith: Eh bien, le CLR initialisera l'ensemble de l'ensemble type i> lorsque toutes les variables statiques de l'intérieur sont référencées, oui. Voir la spécification CLI pour plus de détails sur les garanties exactes.
Il semble que, lors de l'utilisation d'une classe partielle avec plusieurs fichiers source, l'ordre de l'initialisation des champs statiques sera basé sur la commande que les sources sont ajoutées à la compilée incluent dans le fichier .csproj (puis par l'ordre textuel dans chaque fichier). . Donc, si dans une initialisation de champ statique dans le fichier B, vous faites référence à un champ statique à partir du fichier A (à partir de la même classe partielle), assurez-vous que le fichier A est compilé inclus avant fichier B dans le CSPROJ.
Si vous êtes préoccupé par la commande, vous pouvez toujours placer votre code dans le constructeur statique. C'est là que j'inscrise mes propriétés de dépendance. P>
Non, je pense que peu fiable n'est pas le mot correct ici. P>
Dans True Scénario à thread unique, les membres statiques de la classe sont initialisés lorsque l'un des membres statiques du type est d'abord accessible dans votre code. p>
Je ne suis pas au courant de C ++, mais oui uniquement dans certains cas comme dans un environnement multi-fileté si deux types tentent d'accéder à la ressource partagée et si cela est statique, il est impossible de dire qui va gagner et lequel fonctionnera correctement. < / p>
L'exemple MSDN est correct et cela fonctionnera correctement. P>