9
votes

Pass par référence: qui est plus lisible / non?

J'ai la classe suivante:

public Person ChangeName(Person p, String name)
{
     p.Name = name;
     return p;
}


6 commentaires

Techniquement, p 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 contient et passe une référence, mais n'est pas transmis par référence - 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, ...) permettrait à quelque chose comme p = foo 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.


8 Réponses :


12
votes

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;
}


0 commentaires

0
votes

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.

Si vous posez une question de méta qui implique une conception au-dessus du code que vous avez posté, alors il me manque.


0 commentaires

0
votes

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?


0 commentaires

1
votes

Il n'y a rien de bien / faux avec l'une ou l'autre approche. Dépend de ce que votre programme a besoin.

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.

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.

Ne le faites que si vous avez vraiment besoin de la flexibilité.


0 commentaires

1
votes

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 };    
}


0 commentaires

0
votes

Je pense que votre 2e approche n'est pas plus lisible Yagni . Mais si vous changez comme ça comme ça xxx

, vous aurez une extension pour une interface courante a la Xxx


0 commentaires

1
votes

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.


0 commentaires

0
votes

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> xxx pré>

éditer: auto mise en œuvre Propriétés P>

public string Name
{
   set;
   get;
}


0 commentaires