J'ai une question concernant le type de constructeurs dans un type de Valeur. Cette question a été inspiré par quelque chose que Jeffrey Richter a écrit dans le CLR via C# 3e éd, il a dit (à la page 195 - chapitre 8) que vous ne devriez jamais réellement définir un constructeur de type à l'intérieur d'un type de la valeur qu'il y a des moments où le CLR ne sera pas l'appeler.
Ainsi, par exemple (bien...Jeffrey Richters exemple), je ne peux pas savoir, même en regardant le IL, pourquoi le constructeur de type n'est pas appelée dans le code suivant:
internal struct SomeValType
{
static SomeValType()
{
Console.WriteLine("This never gets displayed");
}
public Int32 _x;
}
public sealed class Program
{
static void Main(string[] args)
{
SomeValType[] a = new SomeValType[10];
a[0]._x = 123;
Console.WriteLine(a[0]._x); //Displays 123
}
}
Donc, en appliquant les règles suivantes pour le type des constructeurs, je ne peux pas voir pourquoi le type de la valeur constructeur ci-dessus n'est pas appelée à tous.
- Je peux définir une valeur statique type de constructeur pour définir l'état initial du type.
- Un type ne peut pas avoir plus qu'un seul constructeur - il n'existe pas par défaut.
- Type de constructeurs sont implicitement privé
- Le compilateur JIT vérifie si le type du constructeur de type a déjà été exécutés dans ce domaine d'application. Si non, il émet l'appel en code natif, sinon ce n'est pas comme il sait le type est déjà initialisé'.
Alors...j'ai juste ne peux pas savoir pourquoi je ne peux pas voir ce type de tableau en cours de construction.
Ma meilleure supposition serait que cela pourrait être:
- La façon dont le CLR construit un tableau de type. J'aurais pensé que le constructeur statique sera appelé lorsque le premier élément a été créé
- Le code dans le constructeur n'est pas l'initialisation des champs statiques de sorte qu'il est ignoré. J'ai expérimenté avec de l'initialisation statique privé de champs dans le constructeur, mais le champ reste la valeur par défaut de 0, donc le constructeur n'est pas appelé.
- Ou...le compilateur est en quelque sorte l'optimisation de loin l'appel du constructeur en raison du public Int32 d'être ensemble - mais qu'est floue deviner au mieux!!
Meilleures pratiques, etc asside, je suis juste super intrigué par elle que je veux être en mesure de voir par moi-même pourquoi il n'est pas appelée.
EDIT: j'ai ajouté une réponse à ma propre question ci-dessous, juste une citation de ce que Jeffrey Richter dit à ce sujet.
Si quelqu'un a des idées, ce serait génial. Merci beaucoup, James