464 votes

Meilleures pratiques : Initialiser les champs de la classe dans le constructeur ou à déclaration ?

J’ai récemment été programmation en c# et Java et je suis curieux de savoir ce que les gens considère les meilleures pratiques concernant quand vous devez initialiser votre champs de classes ?

Devez vous faire à déclaration ? :

ou dans un constructeur...

Je suis vraiment curieux de ce que certains d'entre vous, les anciens combattants pense est la meilleure pratique... Je veux être cohérent et s’en tenir à une approche.

344voto

kokos Points 10083

Mes règles :

  1. ne pas initialiser avec les valeurs par défaut dans la déclaration (null, false, 0, 0.0...).
  2. préférez l’initialisation de la déclaration si vous n’avez pas un paramètre de constructeur qui modifie la valeur du champ.
  3. Si la valeur du champ est modifiée en raison d’un paramètre de constructeur mettre l’initialisation les constructeurs.
  4. Soyez cohérent dans votre pratique. (la règle la plus importante)

153voto

Quibblesome Points 14441

En c# il n’importe pas. Les deux exemples de code que vous donnez sont tout à fait équivalentes. Dans le premier compilateur exemple c# (ou est-ce le CLR ?) construira un constructeur vide et initialiser les variables comme s’ils étaient dans le constructeur. S’il existe déjà un constructeur alors toute initialisation « ci-dessus » est déplacée dans la partie supérieure de celui-ci.

En termes de meilleures pratiques le premier est moins sujet aux erreurs que celui-ci comme quelqu'un pourrait facilement ajouter un autre constructeur et oublier de la chaîne il.

17voto

AnonJ Points 127

Je pense qu’il y a une mise en garde. J’ai une fois commis une telle erreur : à l’intérieur d’une classe dérivée, j’ai « initialisé à la déclaration » les champs héritée de la classe de base abstraite. Instance du polymorphisme j’ai vraiment foiré, et le résultat était qu’il existait deux ensembles de champs, une « base » et un autre est ceux nouvellement déclarées. La leçon était il n’y a qu’une seule façon correcte pour initialiser les champs dans des classes dérivées qui doit le faire à l’intérieur du constructeur.

16voto

La sémantique du langage c# diffère légèrement de Java ici. En c#, assignation en déclaration est effectuée avant d’appeler le constructeur de la superclasse. En Java c’est fait immédiatement après qui permet de « this » à utiliser (particulièrement utile pour les classes internes anonymes) et signifie que la sémantique des deux formes ne correspondre vraiment pas.

Si vous le pouvez, faites les champs final.

4voto

Dan Blair Points 1580

Que faire si je vous l'ai dit, ça dépend?

J'en général tout initialiser et de le faire de manière cohérente. Oui c'est trop explicite, mais c'est aussi un peu plus facile à maintenir.

Si nous sommes inquiets à propos de la performance, et puis-je initialiser uniquement ce qui doit être fait et de le placer dans les zones où elle donne la plupart de coup pour le mâle.

Dans un système en temps réel, je me demande si j'ai encore besoin de la variable ou de la constante.

Et en C++, je le fais souvent à côté de ne pas faire d'initialisation dans un lieu et de le déplacer dans une fonction Init (). Pourquoi? Eh bien, en C++, si vous êtes à l'initialisation de quelque chose qui peut lever une exception lors de la construction d'objets, vous vous ouvrez à des fuites de mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X