2010-09-30 7 views
1

Avec un de mes collègues de travail se disputent souvent sur "la bonne façon" d'écrire des méthodes "Get". Mon opinion est object GetSomeObject(). Mon collègue pense qu'il est préférable d'être void GetSomeObject(object obj). Je sais que le résultat est le même dans les deux cas. Je veux entendre et d'autres opinions. Ohhh j'ai oublié de dire pour quelle plate-forme nous parlons - .NET Framework la langue est C#.Quelle est la bonne façon d'écrire la méthode 'Get'?

+9

Je serais ravi d'entendre les arguments de votre collègue sur les raisons pour lesquelles son chemin est meilleur. –

+0

Eh bien je vais essayer de lui faire rendre compte ici et poster (mais je ne suis pas sûr qu'il le fera). – ikirachen

Répondre

1

Il lit plus facile et est une bonne pratique de codage pour renvoyer une valeur, sur la modification d'un paramètre de référence (qui pour moi au moins, est un moyen de la vieille école d'obtenir des valeurs de retour)

Si vous recherchez une signification plus profonde:

Les paramètres de fonction en C# sont créés en tant que Value parameters by default (en fonction des paramètres de référence).

Pour modifier la valeur du paramètre et conserver cette modification pour le code appelant, le paramètre doit être déclaré référence. Vous savez probablement tout cela.

est ici la différence: la valeur et les paramètres ref sont stockés sur la pile (ce qui est très efficace), mais données du paramètre de référence est stored on the heap. Il y a donc une fraction de surcoût en utilisant des valeurs de référence.

Dans la plupart des cas, ce n'est pas un problème du tout, mais certains problèmes pourraient surgir, comme:

  • fonctions récursives qui utilisent trop de pile (et vous obtenez un débordement de pile)
  • fonctions qui nécessite la vitesse, comme le calcul des nombres premiers ou des fractales

Il y a probablement plus, et de meilleurs exemples, que ce que j'ai donné, vous avez cependant l'idée.

+0

Ouais j'ai eu l'idée, merci pour la réponse complète.Je vais l'utiliser la prochaine fois]:> – ikirachen

1

objet getSomeObject(); est mieux.

+0

D'accord - c'est la manière la plus courante dans le framework .NET lui-même, donc il est plus logique de suivre le même modèle. –

+1

Cela devrait être 'GetSomeObject', conformément aux directives de conception du cadre. –

2

Bien sûr object GetSomeObject() est mieux. L'autre est plus un setter qu'un getter ...

8

Si elle est simple obtenir alors il devrait être une propriété

public object SomeObject 
{ 
    get { return _someObj; } 
} 

si elle est calcul alors

object GetSomeObject() { ... } 

est loin plus communément attendu. En outre, l'autre devrait avoir un ref ou un out qui est déconseillé si le premier peut être atteint

+0

"doivent avoir ref ou out" pas nécessairement, les objets sont passés par référence par défaut. Cette affirmation ne s'applique réellement que si c'est un objet de valeur (int, char etc) plutôt qu'un objet de référence (si cela a du sens) ... Mais pour des raisons de lisibilité, il est généralement préférable de clarifier ce que vous essayez de faire en utilisant ref/out – Xander

+0

Cependant, je suis d'accord avec l'utilisation des propriétés, sauf s'il y a une logique métier, puis utilisez la méthode que vous avez décrite. – Xander

+0

@Xander, En fait, le pointeur sur l'objet est passé par valeur, tout comme un type de valeur. C'est juste le pointeur qui est copié et non la structure réelle. Si vous voulez changer l'instance des appelants pour en créer une nouvelle, vous avez besoin de ref ou out (comme un type de valeur). Parce que l'instance n'est pas copiée, tout ce que vous pouvez faire est de changer son état et avec une méthode ayant une signature 'Get', on ne s'attend pas à ce qu'une méthode le fasse, sinon d'autres effets secondaires. – aqwert

3

void GetSomeObject(object obj) n'obtiendra rien. Si vous avez activé dans un paramètre out vous pouvez attribuer une valeur à lui, et il serait travailler techniquement, acheter pourquoi, lorsque vous pouvez utiliser les types de retour exactement comme ils étaient destinés:

public void GetSomeObject(out returnObject) 
{ 
    returnObject = ... 
} 

ou

public object GetSomeObject() 
{ 
    return ... 
} 
+0

Ohh ouais j'ai oublié le mot-clé 'out'. Merci pour la correction. – ikirachen

+0

si le returnObject est un objet réel et que vous y apportez des modifications car il est passé par référence, vous verrez les changements reflétés ... Cependant, je pense toujours que l'utilisation de propriétés est la meilleure sauf si vous effectuez une logique métier, quel cas "object GetSomeObject() {...}" – Xander

1

D'une manière générale la première façon est plus typique et meilleure car object GetSomeObject() vous permet de faire ce qui suit: GetSomeObject().Foo(). Et c'est un peu plus intuitif. Cependant, bool GetSomeObject(out object obj) peut être utile comme dans le cas de TryGetValue() dans la classe Dictionary.

0

Je peux assez vois bien une seule raison d'utiliser void GetSomeObject(out object obj) au lieu de object GetSomeObject() et qui est si vous vous débarrasser du vide et au lieu de faire quelque chose comme ErrorResult GetSomeObject(out object obj) (et la GetSomeObject-opération est velue et sujette à erreur) puisque vous peut ensuite signaler le statut via la valeur de retour.

Cependant, cela serait encore mieux géré via de simples anciennes exceptions IMHO. Bien que je sache que certaines normes de codage disent que les exceptions ne devraient pas être utilisées du tout et dans ces cas, vous pourriez vouloir faire quelque chose comme ça.

Encore, je dirais juste aller avec une propriété ou le object GetSomeObject() sauf si vous avez un vraiment bonne raison de ne pas le faire.

Questions connexes