J'ai la classe suivante:
public Person ChangeName(Person p, String name) { p.Name = name; return p; }
8 Réponses :
Est-ce plus lisible? N ° en fait, vous risquez peut-être plus de nuire à leur bien.
En l'avoir renvoyé un objet de personne, cela pourrait vous amener à croire qu'au lieu de modifier le paramètre de la personne, il crée une nouvelle personne basée sur P mais avec Un nom différent et une personne pourraient supposer de manière incorrecte que p n'est jamais changé. p>
de chaque sens, si vous avez une méthode qui n'a aucun effet sur la classe, il est en dehors de cela devrait probablement être statique. Cela vous aide à savoir avec certitude que cela n'affecte pas sa classe. Seulement la méthode renvoie une valeur si vous en avez besoin pour renvoyer une valeur. P>
Voici ma recommandation pour cette méthode: P>
public static void ChangeName(Person p, String name) { p.Name = name; }
Dans le cas où vous avez décrit, je dirais ni. Ce n'est pas vraiment clair ce que vous essayez de faire avec cette méthode. Utilisez simplement l'objet et définissez la propriété. L'insertion d'une méthode dans le chemin d'exécution complique simplement la compréhension et crée une autre dépendance à l'objet de la personne et à sa valeur sous-jacente. P>
Si vous posez une question de méta qui implique une conception au-dessus du code que vous avez posté, alors il me manque. P>
Le premier est meilleur, à cause de cela, le second pourrait vous conduire à croire que P est immuable. Mais toute la méthode est inutile car elle appelle simplement le setter. Pourquoi ne pas simplement appeler le setter directement? P>
Il n'y a rien de bien / faux avec l'une ou l'autre approche. Dépend de ce que votre programme a besoin. P>
retourner le paramètre passé dans une méthode est rarement nécessaire car il est toujours possible que l'utilisateur n'utilise que la variable passée à la place de l'argument. P>
Il vous donne toutefois la possibilité de remplacer cette mise en œuvre ou de transmettre cette implémentation dans une autre fonction qui accepte les délégués avec des signatures similaires. Ensuite, vous pouvez passer à d'autres implémentations qui ne renvoient pas l'objet de la même personne. P>
Ne le faites que si vous avez vraiment besoin de la flexibilité. P>
Je vous suggère d'utiliser l'une des options suivantes pour la meilleure lisibilité:
public static void ChangeName(Person p, String name) { p.Name = name; } public static Person WithName(Person p, String name) { return new Person(p) { Name = name }; }
Je pense que votre 2e approche n'est pas plus lisible Yagni . Mais si vous changez comme ça comme ça , vous aurez une extension forte> pour une interface
Tout d'abord p n'est pas transmis par référence dans le premier exemple. Votre deuxième méthode fait croire qu'il renvoie une nouvelle référence que ce n'est pas le cas. Donc, je ne pense pas que le second est plus clair que le premier. P>
ici est la référence définitive pour comprendre les paramètres de passage par valeur / référence.
Regarder le code, pourquoi n'utilisez-vous pas la propriété? p> éditer: auto mise en œuvre Propriétés P> public string Name
{
set;
get;
}
Techniquement,
p code> n'est pas transmis par référence dans aucun de ces exemples.
@Amber comment ça va? Je suis à peu près sûr que c'est tout à fait incorrect.
p code> contient i> et passe i> une référence, mais n'est pas transmis par référence i> - il y a une différence distincte entre les deux . Pass par référence (en déclarant les arguments comme
Changename (référence P, ...) code> permettrait à quelque chose comme
p = foo code> pour changer complètement quelle personne la variable de l'appelant était pointant au point, pas seulement le contenu de la personne actuellement pointée.
Pour plus de détails, voir MSDN.MicRosoft.com/ EN-US / Bibliothèque / 0f66670Z (v = vs.71) .aspx Exemples # 4 et n ° 5.
@Amber - Droite. Droit. J'ai vissé ça.
@Ian: S'il vous plaît voir, si ma réponse aide.