J'ai une étrange habitude qu'il semble... selon mon collègue au moins. Nous avons travaillé sur un petit projet ensemble. La façon dont j'ai écrit les classes (exemple simplifié):
[Serializable()]
public class Foo
{
public Foo()
{ }
private Bar _bar;
public Bar Bar
{
get
{
if (_bar == null)
_bar = new Bar();
return _bar;
}
set { _bar = value; }
}
}
Donc, fondamentalement, je ne initialiser un champ lorsqu'un getter est appelé et le champ est toujours null. J'ai pensé que cela permettrait de réduire la surcharge par le pas de l'initialisation de toutes les propriétés qui ne sont pas utilisées n'importe où.
ETA: La raison pour laquelle je n'ai c'est que ma classe possède plusieurs propriétés qui renvoie une instance d'une autre classe, qui à leur tour ont également des propriétés avec encore plus de classes, et ainsi de suite. Appeler le constructeur de la classe supérieure qui allait par la suite appeler tous les constructeurs pour toutes ces catégories, quand ils ne sont pas toujours nécessaires.
Existe-il des objections à l'encontre de cette pratique, d'autres que la préférence personnelle?
Mise à JOUR: j'ai examiné les nombreuses opinions divergentes en ce qui concerne cette question et je tiens à ma accepté de répondre. Cependant, j'ai maintenant une bien meilleure compréhension du concept et je suis en mesure de décider quand utiliser et quand ne pas.
Inconvénients:
- Fil les questions de sécurité
- Ne pas obéir à un "setter" demande lorsque la valeur transmise est null
- Micro-optimisations
- La gestion des exceptions devraient prendre place dans un constructeur
- Besoin de vérifier la valeur null dans la catégorie " code
Pour:
- Micro-optimisations
- Les propriétés ne jamais retourner la valeur null
- Retarder ou d'éviter le chargement des "gros" objets
La plupart des inconvénients ne sont pas applicables à ma bibliothèque actuelle, cependant j'aurais tester pour voir si le "micro-optimisations" sont en fait de l'optimisation de quoi que ce soit.
DERNIÈRE MISE À JOUR:
Ok, j'ai changé ma réponse. Ma question initiale était de savoir si ou pas c'est une bonne habitude. Et je suis maintenant convaincu qu'il ne l'est pas. Peut-être que je vais encore l'utiliser dans certaines parties de mon code actuel, mais pas de manière inconditionnelle et certainement pas tout le temps. Donc, je vais perdre mon habitude d'y réfléchir avant de l'utiliser. Merci à tous!