-2
votes

Le compilateur ajoutera-t-il le constructeur statique par défaut en C #

En général, le compilateur ajoute le constructeur par défaut lorsque nous ne déclarons aucun constructeur explicitement. De la même manière, cela attribue également un constructeur statique par défaut. Si non, pourquoi? Si oui, pourquoi? et dans quelle situation?


9 commentaires

C # Compilateur n'ajoute pas le constructeur statique dans une classe, il ajoute le constructeur d'instance par défaut lorsque vous ne spécifiez aucun. Il ajoute de sorte que vous puissiez créer une instance de votre classe.


Conceptuellement, vous devriez y penser comme ne l'ajoutant pas. Pourquoi aurait-il besoin de? Pour une classe, cela doit donc vous pouvez l'instancier. Mais vous n'appelez jamais explicitement un constructeur statique, de sorte que ce soit ou non un constructeur vide est un détail de mise en œuvre qui n'a aucun impact significatif sur vous.


Cela ressemble à un problème xy -


@MJWILLS SIR, j'ai juste besoin de la raison pour laquelle le constructeur statique est donné par défaut. Et on nous a dit qu'il n'y a qu'une seule situation où le compilateur ajoute le constructeur statique. Sais-tu quand?


@Akarsharao, comme vous pouvez le constater, lorsque vous ne déclarez pas constructeur statique pour Yourtype explicitement, typeof (yourtype) .typeinitalizer est null Je pense qu'il n'y a pas de constructeur statique autogénéré.


@ vasily.sib ok merci monsieur. Et tu connais une situation dans laquelle le constructeur statique est donné par le compilateur.


Je posterai une réponse pour résumer toutes mes connaissances


On nous a dit qu'il n'y avait qu'une seule situation où le compilateur ajoute le constructeur statique qui vous a dit cela? Pourquoi ne demandez-vous pas eux ce qu'ils signifiaient?


4 Réponses :


0
votes

vous et @mjwills ont raison. En l'absence d'un constructeur d'instance explicitement défini, on sera automatiquement créé par CLR Voir 10.11.4 de la spécification de langue C #. , de sorte que ces deux classes sont égales (sauf le nom du cours) dans IL:

class E { public static int I; public static int P { get; set; } }
typeof(E).TypeInitializer == null // true
typeof(E).GetConstructors(BindingFlags.Static | BindingFlags.NonPublic).Length == 0 // true


0 commentaires

2
votes

Non, il n'y a pas de constructeurs statiques générés automatiquement en C #.

Il n'est pas nécessaire que le compilateur crée un constructeur statique automatique - les seuls éléments à utiliser dans le constructeur statique sont des champs statiques / propriétés, mais que l'initialisation se produit à l'extérieur du constructeur statique. Ce n'est pas le cas pour le constructeur d'instance car vous avez besoin d'un constructeur pour pouvoir créer une instance (sauf si elle est une classe statique) - le compilateur a donc dû créer un s'il n'y en a pas spécifié.

statique Initialzation sur le terrain :

... Si un constructeur statique existe dans la classe, l'exécution des initialisateurs de champ statiques se produit immédiatement avant d'exécuter ce constructeur statique. Sinon, les initialisateurs de champ statiques sont exécutés à un délai dépendant de la mise en œuvre avant la première utilisation d'un domaine statique de cette classe.

plus d'informations peut être trouvée par exemple dans CLASSES SECTION DE C # 6.0 Projet de spécification. En particulier, vous pouvez voir que Les constructeurs par défaut appellent explicitement explicitement fourni une:

Si une classe ne contient aucune déclaration de constructeur d'instance, un constructeur d'instance par défaut est automatiquement fourni.

tandis que constructeurs statiques n'a aucune information à ce sujet «fourni automatiquement».


0 commentaires

4
votes

Si vous ne fournissez pas de constructeur de votre classe, c # crée une par défaut qui instancie l'objet et définit les variables de membre aux valeurs par défaut énumérées dans la table Valeurs par défaut. Constructeur sans paramètres est appelé constructeur par défaut. En d'autres termes, ce type de constructeur ne prend pas de paramètres. L'inconvénient d'un constructeur par défaut est que chaque instance de la classe sera initialisée sur les mêmes valeurs et qu'il n'est pas possible d'initialiser chaque instance de la classe à différentes valeurs.

Le constructeur par défaut initialise:

Tous les champs numériques de la classe à zéro. Tous les champs de chaîne et d'objet à NULL.


2 commentaires

4
votes

oui. Seulement dans un cas: Lorsqu'une classe ou une structure a une variable statique instalée à des valeurs par défaut personnalisées (disons static int Âge = 18;). Dans ce cas particulier, un constructeur statique par défaut est ajouté au code IL. Outre ce cas, il n'y aura pas de portée du constructeur statique par défaut.


0 commentaires