c# constructeurs vs auto-propriétés et les initialiseurs d'objets

j'ai beaucoup utilisé les propriétés automatiques, mais je m'éloigne de plus en plus de la configuration des classes avec des champs de soutien en lecture initialisés dans le constructeur. Je supprime tous les setters et n'ajoute l'arrière que si la propriété a clairement besoin d'un setter.

je trouve que cela rend mes cours plus robustes et élégants oo sage et je me donne des coups de pied pour ne pas faire cela plus tôt.

je trouve que les constructeurs sont très sous-utilisés en général dans les exemples de code c et je pense que les propriétés automatiques et object initializer sont une grande partie de cela, donc ma question est pourquoi le C# team push fonctionnalités comme ceci et pas se concentre plus sur les fonctionnalités deliver poussant les meilleures pratiques plus. En général, je pense que c'est trop facile d'écrire du mauvais code et je pense que plus pourrait être fait en aidant les codeurs à écrire du bon code

8
demandé sur terjetyl 2010-09-04 03:02:48

3 réponses

à partir de conversations, je crois que L'équipe C# comprend qu'ils ont rendu plus facile d'écrire des types mutables tout en ne fournissant pas le même avantage pour les types immuables. Ce n'est pas qu'ils aient rendu l'immuabilité plus difficile au fil du temps - ils n'ont tout simplement pas rendu les choses plus faciles... sauf pour les types anonymes, qui sont immuables, mais ont divers autres inconvénients. Je ne voudrais certainement pas que les propriétés automatiques soient enlevées - là où elles sont appropriées, elles sont vraiment utiles. Je venais d'avoir l'amour du équivalent pour les propriétés readonly (permettant de les définir juste dans le constructeur).

j'ai trouvé que les arguments nommés et les paramètres optionnels de C# 4 ont rendu plus facile la construction d'instances de type immuables bien que - vous pouvez encore obtenir beaucoup des avantages des initialiseurs d'objets, sans les inconvénients de la mutabilité. Il suffit de fournir des valeurs par défaut pour les aspects de votre type qui sont vraiment optionnels, laissez le reste comme paramètres obligatoires du constructeur, et l'appelant peut faire ce qu'il want-utiliser les arguments nommés pour ajouter de la clarté.

les initialisateurs de collecte sont un écrou plus difficile à casser, malheureusement. J'aimerais voir des initialisateurs "enchaînés" qui pourraient fonctionner avec des collections immuables, de sorte qu'au lieu d'appeler à plusieurs reprises Add sur la même instance, le compilateur peut créer des appels vers Plus qui enchaînés:

ImmutableList<string> x = new ImmutableList<string> { "a", "b", "c" };

go to:

ImmutableList<string> x = new ImmutableList<string>().Plus("a")
                                                     .Plus("b")
                                                     .Plus"(c");

bien sûr, ce serait bien d'avoir plus de collections immuables dans le cadre pour commencer :)

rien de tout cela n'aide du côté de l'auto-props, bien sûr. Je dois admettre que j'ai triché un certain nombre récemment, simulant l'immuabilité en utilisant des setters privés:

public string Name { get; private set; }

Il ne me font me sentir sale, cependant, de ne pas en faire vraiment immuable quand c'est mon intention réelle.

fondamentalement, je dis que je ressens votre douleur - et je suis presque sûr que L'équipe C# le fait. Gardez à l'esprit qu'ils ont des ressources limitées cependant, et la conception une langue est sacrément dure.

Vous pouvez trouver le les vidéos de la SDN 2010 intéressant - il y a une excellente table ronde avec Eric Lippert, Mads Torgersen, Neal Gafter (et moi), et mes propositions pour C# 5 sont dans une autre vidéo.

13
répondu Jon Skeet 2010-09-03 23:13:15

je supprime tous les setters et n'ajoute l'arrière que si la propriété a clairement besoin d'un setter. Je trouve que cela rend mes classes plus robustes et élégantes oo Sage

je suis complètement d'accord avec vous. J'ai fait face au Code d'héritage où il y a beaucoup d'initialisateurs d'objet utilisés pour une certaine hiérarchie de classe. J'avais besoin d'ajouter quelques propriétés et puis j'ai eu un mal de tête avec trouver tous les endroits où les instances de classe sont construites. Première fois que j'ai soumis. Et maintenant je dois en ajouter un plus de la propriété. C'est fou!

pour restreindre l'usage des initialisateurs d'objets, j'ai supprimé le constructeur sans paramètres.

1
répondu Vadim Sukhorukov 2012-07-26 08:56:36

je trouve les constructeurs sont très sous-utilisés généralement dans le code c# et je pense que l'auto-propriétés de l'objet et de l'initialiseur sont une grande partie de ce

si votre objet a beaucoup de propriétés, il est clair que vous ne voulez pas tous les initialiser à partir du constructeur. Avoir à passer plus que, disons, 4 ou 5 paramètres est assez mauvais pour la lisibilité (même si Intellisense rend facile à écrire). Aussi, si vous voulez seulement initialiser quelques propriétés et utiliser le valeur par défaut pour les autres propriétés, Vous avez besoin de beaucoup de surcharges de constructeur, ou vous devez passer ces valeurs par défaut explicitement au constructeur.

dans de tels cas, les initialiseurs d'objets sont très pratiques, tant que les propriétés ne sont pas en lecture seule (mais comme Jon l'a souligné, les paramètres optionnels dans C# 4 sont une bonne alternative)

pourquoi l'équipe c # pousse des fonctionnalités comme celle-ci et ne se concentre pas davantage sur les fonctionnalités deliver poussant les meilleures pratiques plus d'

je pense que les initialiseurs d'objets ont été introduits parce qu'ils étaient nécessaires pour Linq: vous ne pouviez pas créer des types anonymes sans eux. En ce qui concerne les propriétés automatiques, elles sont moins vitales, mais elles étaient probablement faciles à mettre en œuvre et peuvent être un épargnant temps réel pour les propriétés qui ne font rien de plus que d'encapsuler un champ.

0
répondu Thomas Levesque 2010-09-04 00:39:29