J'ai une étrange habitude semble-t-il ... d'après mon collègue du moins. Nous travaillons ensemble sur un petit projet. La façon dont j'ai écrit les classes est (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 n'initialise un champ que lorsqu'un getter est appelé et que le champ est toujours nul. J'ai pensé que cela réduirait la surcharge en n'initialisant aucune propriété qui n'est utilisée nulle part.
ETA: La raison pour laquelle j'ai fait cela est que ma classe a plusieurs propriétés qui renvoient une instance d'une autre classe, qui à son tour a également des propriétés avec encore plus de classes, et ainsi de suite. L'appel du constructeur pour la classe supérieure appellerait ensuite tous les constructeurs pour toutes ces classes, quand ils ne sont pas toujours tous nécessaires.
Y a-t-il des objections contre cette pratique, autres que la préférence personnelle?
MISE À JOUR: J'ai examiné les nombreuses opinions divergentes en ce qui concerne cette question et je maintiendrai ma réponse acceptée. Cependant, je suis maintenant parvenu à une bien meilleure compréhension du concept et je suis en mesure de décider quand et quand l'utiliser.
Les inconvénients:
- Problèmes de sécurité des threads
- Ne pas obéir à une requête "setter" lorsque la valeur transmise est nulle
- Micro-optimisations
- La gestion des exceptions doit avoir lieu dans un constructeur
- Besoin de vérifier la valeur nulle dans le code de la classe
Avantages:
- Micro-optimisations
- Les propriétés ne renvoient jamais null
- Retardez ou évitez de charger des objets "lourds"
La plupart des inconvénients ne s'appliquent pas à ma bibliothèque actuelle, mais je devrais tester pour voir si les "micro-optimisations" optimisent réellement quoi que ce soit.
DERNIÈRE MISE À JOUR:
D'accord, j'ai changé ma réponse. Ma question initiale était de savoir si c'était une bonne habitude. Et je suis maintenant convaincu que ce n'est pas le cas. Peut-être que je vais encore l'utiliser dans certaines parties de mon code actuel, mais pas inconditionnellement et certainement pas tout le temps. Je vais donc perdre mon habitude et y réfléchir avant de l'utiliser. Merci tout le monde!