Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 31028|Répondre: 1

[Source] .ctor et .cctor de .net

[Copié le lien]
Publié sur 06/04/2017 14:56:38 | | | |
.ctor est connu de tous

.cctor n’est pas familier et peut facilement être mal utilisé

Le .cctor dit est un constructeur statique en syntaxe C#

Forme comme




Similarités et différences entre .cctor et .ctor

   1. Vous ne pouvez pas avoir d’identifiants de droits d’accès publics, privés, etc., qui ne peuvent pas être utilisés, ce qui est différent de .ctor

   2. Il ne doit y avoir aucune valeur de retour, ce qui est identique à .ctor

   3. Il ne peut y avoir aucun paramètre, .ctor peut avoir plusieurs paramètres

   4. Il ne peut y en avoir qu’un au maximum, et il doit y avoir au moins un .ctor

   5. Le programmeur ne peut pas contrôler le timing de l’appel .cctor, en un sens, il peut contrôler le timing de son appel

   6. Les programmeurs ne peuvent pas appeler directement .cctor, .ctor Lorsque le programmeur utilise le nouvel opérateur, .ctor sera définitivement appelé


Synchronisation des appels .cctor :


    Le constructeur statique est automatiquement appelé avant que la première instance ne soit créée ou qu’un membre statique ne soit référencé. (Voici la citation originale sur MSDN)

    Il est clair que .cctor n’est appelé qu’une seule fois dans le même domaine de programme, plutôt que d’être appelé à chaque fois qu’un objet est instancié comme .ctor

.cctor utilisation

    Les constructeurs statiques sont utilisés pour initialiser toute donnée statique, ou pour effectuer des opérations spécifiques qui ne doivent être effectuées qu’une seule fois.


Par exemple :

Tout le code suivant est compilé en mode Windows 7, par opposition au mode Release 2005, et si les résultats sont différents, envisagez de passer en mode release et de réessayer




Compilez ce segment de code puis utilisez ILDISM pour le visualiser, la table des méthodes est la suivante



.ctor() : void // Ceci est un constructeur d’instance de la classe fournie automatiquement par le compilateur

Main() :void(string[]) //Point d’entrée du programme

Évidemment, il n’y a pas de .cctor dans l’assembleur, et le compilateur ne fournira pas automatiquement de fonctions .cctor lorsqu’une classe n’a pas de champs statiques à initialiser, ce qui diffère de .ctor, qui existe toujours de toute façon

Modifier le code




En compilant ce code, il y aura un avertissement, mais ce n’est pas important, l’essentiel est que lors de la visualisation de l’assembleur avec ILDASTOM, le .cctor attendu, le constructeur statique n’apparaît pas !


Que s’est-il passé?

L’inférence est-elle fausse ? CCTOR n’est-il pas un champ statique utilisé pour initialiser une classe ?

Du calme, s’il te plaît, regarde le code





La seule différence entre ce code et le précédent est qu’il modifie la valeur initiale du champ statique i, et que l’étape suivante est d’assister au moment magique

Faisons un DASM, et à notre grande surprise, le très demandé .cctor est enfin là !



Regardez le code d’implémentation .cctor et vous verrez :

.méthode privé hidebysig nom spécial rtspecialname static
        void .cctor() cil managed
{
  Taille de code 7 (0x7)
  .maxstack 8
  IL_0000 : ldc.i4.1 // Instancier les champs statiques :-)
  IL_0001 : stsfld int32 only_lonely. A ::i
  IL_0006 : ret
} // fin de la méthode A ::.cctor


Pourquoi en est-il ainsi ? La raison possible est que la valeur par défaut du type Int32 est 0, et que le compilateur détecte cela et l’optimise pour ne pas produire de code .cctor

référence
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx

Enfin, nous pouvons implémenter nous-mêmes une fonction .cctor pour implémenter des exigences fonctionnelles particulières

résumé
1、. CTOR est la méthode de construction ;
2、. cctor est un initialiseur de type, qui est un constructeur statique en C# ;
3. Lorsque la classe C est instanciée, elle attribue d’abord une valeur au champ assigné au moment de la déclaration, puis appelle le constructeur de la classe de base, puis se construit de la même manière, jusqu’au System.Object de niveau supérieur, puis revient exécuter le code dans la méthode explicite de construction de C, qui est un tel processus récursif.





Précédent:Objets génériques liés au contexte : ContextBoundObject et les classes génériques ne sont pas pris en charge
Prochain:Résumé de l’ordre d’exécution des méthodes statiques, non statiques et constructives dans une classe
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com