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. Quelle est la différence entre ces deux classes et pourquoi choisiriez-vous une méthode sur l'autre? P> 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? P> P>
7 Réponses :
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>
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.
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. P>
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. P>
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 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 ). p> Remarque: strong> Je n'ai modifié aucun drapeau d'optimisation lors de la mise sous tension de la construction de déverrouillage. P> P>
Dans MyClass1, quelqu'un pourrait remplacer le constructeur et causer des problèmes. P>
Il y a une différence: p>
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. : P> blockQuote>
comportemental-sage Les deux doivent être identiques. strong> Vous pouvez vérifier cela avec un réflecteur sur le binaire pour ce code SNIPPET P>
Cependant, quelque chose que vous voudrez peut-être envisager est un cas de bord 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.
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
}
Ils ont déjà une valeur par défaut ... pas besoin de les initier à nouveau.