2009-08-19 6 views
3

Notez que le code suivant est dans une classe d'une seule classeUtilisez des propriétés privées ou utilisez-vous? C#

private string _fee; 
private string _receipt; 

public string Fee 
{ 
    get { return _fee; } 
    private set { _fee = value; } 
} 

public string Receipt 
{ 
    get { return _receipt; } 
    private set { _receipt = value;} 
} 

public MyValue(string fee, string receipt) : this() 
{ 
    _fee = int.Parse(receipt).ToString(); 
    _receipt = receipt; 
} 

Comme vous pouvez le voir ma propriété ne fait rien si devrais-je utiliser

_fee = int.Parse(fee).ToString(); 
_receipt = receipt; 

ou

Fee = int.Parse(fee).ToString(); 
Receipt = receipt; 
+0

Oh c'est le premier script que j'utilise avec ReSharper. J'adore! –

Répondre

16

Utilisez les propriétés, et si vous êtes sur C# 3, vous pouvez utiliser les propriétés mises en œuvre automatiquement comme celui-ci:

public string Fee 
{ 
    get; private set; 
} 

public string Receipt 
{ 
    get; private set; 
} 

public MyValue(string fee, string receipt) : this() 
{ 
    this.Fee = int.Parse(fee).ToString(); 
    this.Receipt = receipt; 
} 
10

I utiliserait toujours les propriétés - il vous donne plus de flexibilité:

  • vous pouvez par la suite de créer plus élaborées méthodes getter et setter, si besoin
  • vous pouvez spécifier une visibilité différente sur getter et setter
  • vous pouvez définir les propriétés virtuelles et écraseront celles des classes descendantes, le cas échéant
  • Vous pouvez utiliser la liaison de données avec les propriétés, mais pas avec les champs

De même, il semble que la réflexion .NET se comporte légèrement différemment sur les propriétés par rapport aux champs, donc si vous avez un mélange de propriétés et de champs, vous devez connaître ces différences subtiles - si vous n'utilisez que des propriétés, y Vous pouvez y aller :-)

A l'intérieur de la classe, vous pouvez utiliser soit le champ de sauvegarde, soit la propriété - si vous utilisez la propriété, les effets secondaires que votre setter peut avoir (mise à jour d'autres champs, enregistrement de votre appel, etc.) sera utilisé - si vous accédez directement au champ du magasin de sauvegarde, vous contournez ceux-ci. Cela peut être une bonne ou une mauvaise chose - cela dépend de votre scénario. Sois juste conscient de ce que tu fais! :-)

Marc

+0

+1, mais j'ajouterais "sans rupture de compatibilité binaire" à votre premier point et aux commentaires de réflexion. Dans le cas contraire, vous pouvez tout aussi bien factoriser un champ privé. –

+0

J'ai commencé à me demander si le compilateur C# devrait même autoriser les champs publics. Il ne semble pas y avoir de raison de les utiliser. –

4

Dans ce cas, il n'a pas d'importance, comme Tant que vous êtes cohérent dans votre code.

Si, toutefois, vos propriétés étaient marquées virtual, il ne serait pas judicieux d'y accéder dans votre constructeur, et il serait préférable d'utiliser directement les champs. C'est parce que le comportement de vos propriétés pourrait être surchargé, et votre classe de base pourrait éventuellement faire appel au code de rupture. Edit: Juste pour clarifier, je ne fais référence qu'aux différences dans l'approche de l'exemple de l'OP. marc_s donne quelques bons points sur les raisons pour lesquelles les propriétés peuvent être avantageuses dans la plupart des situations.

0

Je voudrais toujours utiliser les membres directement. Cela est dû au fait que vous pouvez implémenter du code dans le setter qui ne peut pas s'exécuter correctement à partir du constructeur car certains autres champs ne sont pas initialisés.

Cela peut devenir encore pire si les propriétés sont virtuelles comme womp mentionné.

Questions connexes