Quand est-ce en utilisant le C# mot-clé ref jamais une bonne idée?
Plus je vois ref utilisé dans le code de production, le plus mauvais usage que je rencontre et la plus la douleur que me cause. J'ai appris à détester ce mot-clé, car à partir d'un cadre de renforcement de point de vue, il semble idiot. Quand serait-il une bonne idée de communiquer avec les utilisateurs de votre code, la notion de peut-être modification d'un objet de référence/valeur sous?
En revanche, j'aime les mots clés et je les aime encore plus quand aucun des mots-clés sont utilisés à tous, dans les deux cas en raison des garanties que vous avez donné lors de leur utilisation. Ref de l'autre main ne donne aucune garantie, sauf que tu vas être obligé d'initialiser le paramètre avant de vous le transmettre, même si rien ne peut être changé à ce sujet.
Je ne suis pas un développeur sage de bien; je suis sûr qu'il a pratiquement applicable utilise. Je voudrais juste savoir ce qu'ils sont.
Vous devez vous connecter pour publier un commentaire.
La Cadre des lignes Directrices de Conception (un livre par Krzysztof Cwalina et Brad Abrams) recommande d'éviter à la fois
ref
etout
paramètres.Le Cadre des lignes Directrices de Conception citer les canonique
Swap
méthode valide exception:mais en même temps, un commentaire, des remarques
TryParse
méthodes ont été conçues. 🙂La plupart des
Interlocked
méthodes utilisationref
paramètres pour (je suis sûr que vous êtes d'accord) une bonne raison.J'ai essayer de l'éviter sur les Api publiques, mais il a certainement des usages. Mutable types de valeur est importante, surtout sur des choses comme la MUCOVISCIDOSE (où les structures mutables sont plus fréquents, à cause des exigences de la plate-forme). Cependant, peut-être la plus commune de fois que je l'utilise, c'est quand refactoring parties d'un algorithme complexe dans un petit nombre de méthodes, d'où un état de l'objet est exagéré, et j'ai besoin de passer plusieurs valeurs autour de:
c'est à dire
etc. Où
DoSomethingSpecific
est une méthode privée, vient d'emménager à garder méthode responsabilité gérable.Tout moment vous souhaitez modifier la valeur d'un valeur type - ce qui se passe beaucoup de choses dans le cas où vous souhaitez efficacement mettre à jour une paire de valeurs liées (c'est à dire plutôt que de retourner une structure contenant deux entiers, vous passez (ref int x, ref int y))
Peut-être quand vous avez un struct (qui est un type de valeur):
et
Ici vous êtes à l'utilisation de deux paramètres avec
out
comme:l'imagerie de la méthode ayant plus d'un
Foo
ensuite, vous recevez deux fois les paramètres deout
contreref
. Une alternative est de retourner un N-tuple. Je n'ai pas d'exemple concret sur l'utilisation de ce genre de choses.Ajouter sur: Différents
.TryParse
méthodes pourraient également éviterout
si ils sont retournésNullable<T>
à la place qui est essentiellement un tuple deboolean * T
.??
de sorte que les utilisateurs le savent. J'ai utilisé la méthode d'extension comme:jf (Request["SomeHeader"].ToBoolean() == true)
qui je pense vraiment que c'est agréable. Il fonctionne également lorsque l'en-tête est null, mais il peut ne pas être clairement qu'il n'.C'est utile lorsque vous avez besoin efficaces en place des algorithmes sur bignums.
Hypothétiquement, je suppose que vous pourriez l'utiliser beaucoup de ref/arguments out si vous aviez l'intention d'imiter l'architecture des anciens de procédure du logiciel, par exemple les vieux moteurs de jeu et ainsi de suite. J'ai scanné le code source de l'un, je pense que c'était Duke Nukem 3D, et c'est procédurale, avec beaucoup de sous-programmes de la modification des variables à la place, et presque pas de fonctions. De toute évidence, tu serais probablement pas de programme de ce genre pour une production réelle de l'application, sauf si vous en aviez un objectif spécifique à l'esprit.
Que diriez-vous si l'on souhaite passer un tableau à une fonction qui pourrait ou ne pourrait pas modifier sa taille et de faire autre chose pour elle. Souvent, on tourne le tableau dans un autre objet, mais si l'on souhaite gérer le tableau directement le passage par référence semble la plus naturelle.
Je suis en utilisant ref assez souvent. Il suffit de penser fonctions avec plusieurs valeurs de retour.
Il n'est pas judicieux de créer un retour de l'objet (objet application d'assistance) ou même en utilisant des tables de hachage pour ce but.
Exemple:
Edit:
Il est préférable d'utiliser ici - comme le faisait remarquer.
Je l'utilise pour traiter les objets:
out
mot-clé au moment de retourner plusieurs valeurs.ref
ne serait vraiment pas approprié ici.out
comme indiqué. Mais vous devriez également considérer la possibilité d'utiliser un objet d'assistance. Si vous avez plus de deux valeurs de retour, il a tendance à être le plus propre stratégie.the difference between out and ref parameters is not widely understood
fait dans dtb réponse.ref
mot-clé ici. C'est pas requis pour la modification des propriétés d'un objet en fonction de la classe (= un type de référence).Un autre exemple utile en plus de swap<> est-ce:
Utiliser ici ce n'est pas une option