9
votes

Initialisation des champs de classe sur la définition de champ ou dans le constructeur de classe

J'ai une classe avec un champ qui doit être initialisé lorsque l'objet est initialisé, tel qu'une liste à créer avant d'être créée avant que des objets puissent être ajoutés / supprimés de celui-ci. XXX

Quelle est la différence entre ces deux classes et pourquoi choisiriez-vous une méthode sur l'autre?

Je fixe généralement le champ dans le constructeur, comme dans MyClass1, car je trouve plus facile de pouvoir être capable de pouvoir Regardez dans un endroit pour voir toutes les choses qui se produisent lorsque l'objet est instancié, mais existe-t-il un cas où il est préférable d'initialiser un champ directement comme dans MyClass2?


1 commentaires

Ils ont déjà une valeur par défaut ... pas besoin de les initier à nouveau.


7 Réponses :


0
votes

Les codes sont équivalents car le compilateur a mis l'initialisation dans chaque constructeur que vous avez dans chaque constructeur, l'avantage du second cas est que le programmeur ne pensera pas à initialiser les champs lorsqu'il ajoutera un nouveau constructeur après année d'écriture de la classe :) < / p>


1 commentaires

Le développeur qui crée initialement la classe devrait utiliser une chaîne appropriée du constructeur afin que cela ne soit pas un problème. Cependant, le programmeur qui modifie la classe A année plus tard, mieux comprendre la classe avant qu'il ne la touche. Il devrait s'assurer que tous les champs sont en train d'initialiser correctement.



0
votes

en C # Il n'y a pratiquement aucune différence entre vos deux exemples. Mais, le développeur a tendance à initialiser ses champs dans le constructeur car il est moins sujet aux erreurs.


0 commentaires

2
votes

Lors de l'initialisation d'un constructeur, je penserais qu'il serait plus facile d'attraper et de gérer des exceptions si cela est nécessaire.


0 commentaires

5
votes

Les ILS émis par C # compilateur (VS2008 SP1) seront presque équivalents pour les deux cas (même dans les bâtiments de débogage et de libération).

Toutefois, si vous besoin d'ajouter des constructeurs paramétrés qui prennent Liste de la liste < em> comme argument , il sera différent (surtout, lorsque vous créerez un nombre significativement grand d'objets avec de tels constructeurs).

Voir les exemples suivants pour voir les différences (vous pouvez copier et passer sur VS et la construire pour voir ILS avec réflecteur ou Ildasme ). xxx

Remarque: Je n'ai modifié aucun drapeau d'optimisation lors de la mise sous tension de la construction de déverrouillage.


0 commentaires

1
votes

Dans MyClass1, quelqu'un pourrait remplacer le constructeur et causer des problèmes.


0 commentaires

3
votes

Il y a une différence:

Les champs sont initialisés immédiatement avant le constructeur de l'objet l'instance est appelée, donc si le constructeur attribue la valeur d'un champ, il écrasera toute valeur donné pendant la déclaration de champ. :


0 commentaires

3
votes

comportemental-sage Les deux doivent être identiques. strong>

Cependant, quelque chose que vous voudrez peut-être envisager est un cas de bord il - BLOAT fort>. L'IL pour les initialisateurs de terrain est inséré au sommet de chaque CTOR. Et à partir de celui-ci, il s'ensuit que si vous avez de nombreux initialisateurs de champ forts> et de nombreux ctors surchargés forts>, la même section d'IL est préfixée à la surcharge CTOR IL. En conséquence, la taille totale de votre assemblée peut augmenter par rapport au cas où vous utilisez le chaînage de constructeur ou délégué à une fonction commune initialisée () code> (lorsque l'IL répété serait un appel de méthode). Par conséquent, pour ce scénario spécifique, les initialisateurs de champ seraient un choix relativement plus faible.

Vous pouvez vérifier cela avec un réflecteur sur le binaire pour ce code SNIPPET P>

public class MyClass2
   {
    private List<int> whack = new List<int>();
    // lots of other field initializers

    public MyClass2()
    {
       Console.WriteLine("Default ctor");
    }
    public MyClass2(string s)
    {
       Console.WriteLine("String overload");
    }
      // lots of other overload ctors
   }


0 commentaires