2008-11-17 7 views
2

J'ai une classe qui a quelques propriétés. Et je veux quelque chose qui calcule un score sur ces propriétés. Puisque c'est une tâche triviale (quelques ajouts et divisions, mais rien de spectaculaire). Donc, naturellement, la question est: "Quand utiliser une propriété avec du code dans le getter, et quand utiliser une fonction?", Et that question was already answered. Maintenant, je m'interroge sur une chose: si - contre toute attente - j'ai jamais eu besoin de rendre ce Getter si compliqué qu'il devrait être une fonction (par exemple, parce que je dois mettre des données dedans ou parce qu'il peut jeter une exception ou autre), est-il facile de changer une propriété en une méthode?Modification d'une propriété en une méthode - des effets secondaires?

Bien sûr, il semble vraiment trivial, juste changer

public double Score { 
    get { 
     return Math.Round(A + B/C * D,3); 
    } 
} 

à

public double Score(){ 
    return Math.Round(A + B/C * D,3); 
} 

Mais je me demande: Y a-t-il des effets secondaires? Est-ce que quelque chose va se casser quand on change des trucs comme ça? Je ne peux jamais voir cela comme un problème possible quand la réflexion est impliquée, mais dans les situations où j'ai 2 assemblées - une qui définit la classe et une qui utilise la classe - et seulement changer celle qui contient la classe sans recompiler le consommateur Assemblée. Est-ce une source possible de «bugs bizarres qu'il est presque impossible de suivre» ou est-il complètement sûr de changer les propriétés en méthodes?

Répondre

1

Non, il n'y a pas à ce côté affecte du tout.

Tirez réflecteur, vous verrez que vos propriétés sont déjà des méthodes

Sous le capot et les getset accesseurs dans une propriété sont simplement convertis en get_MyPropertyName() et set_MyPropertyName() méthodes. C'est aussi pourquoi vous pouvez (mais ne devriez pas normalement) ajouter des paramètres à une propriété. Le seul "gotcha" est qu'en C#, vous devrez ajouter "()" à tous les appels existants.

également

selon les instructions de codage, un nom de propriété est généralement de nom (à savoir Score), mais les méthodes doivent décrire actions (verbe), donc plus nom propre est GetScore() ou CalculateScore()

+0

Merci. J'avais juste peur qu'il y ait plus de magie noire cachée. Accepter cette réponse parce qu'elle est plus élaborée, mais mise à la fois les deux. –

3

Tirez réflecteur, vous verrez que vos propriétés sont déjà des méthodes :)

+0

Oui, exactement la même chose sous les couvertures –

1

Si vous allez changer de propriété à la méthode et permettre au compilateur de vous montrer où ajouter le parethesis, vous pourriez obtenir des bugs subtils comme object ting = thing.scoreting serait une double boîte pour la version de la propriété de la partition, mais un délégué pour une version de la méthode de pointage donc différent chemin de code entraînerait où:

public void erm(double param){ //stuff here} 
public void erm(func<double> param) {// different stuff here} 

quand vous appelez avec

erm(thing.score) 

avec la propriété en fonction de la version de la méthode du score.

1

Un des effets secondaires est la rupture de tout le code appelant de cette propriété. Vous aurez mettre à jour tous les appelants à nous la signature de la méthode plutôt que la propriété

0

Comme d'autres déjà souligné - rien à craindre. Je publie juste pour clarifier que selon les directives de codage, un nom de propriété est habituellement nom (ie Score), mais les méthodes doivent décrire des actions (verbe), donc le nom plus correct est GetScore() ou CalculateScore() :)

Grammaire nazie en action :)

Questions connexes