2010-02-12 10 views
7

Je vois tout le temps:Pourquoi utilisez-vous des variables privées avec C# getter/setters?

private int _myint; 

    public int MyInt 
    { 
     get 
     { 
      return _myint; 
     } 
     set 
     { 
      _myint = value; 
     } 
    } 

Pour moi, cela semble identique à:

public int MyInt{ get; set; } 

Alors, pourquoi tout le monde font l'ancien ... POURQUOI LE PRIVÉ VAR EN TOUT ?!

+6

Il existe une variable privée dans * deux * cas, mais dans le second cas, elle est générée par le compilateur. –

Répondre

31

Tout d'abord, c'est nouveau pour C# 3.0, il n'était pas là avant. Deuxièmement, si vous voulez ajouter une logique personnalisée à votre getter et setters, vous n'avez pas le choix. Alors oui, dans votre exemple où il n'y a pas de logique personnalisée, c'est la même chose (en fait le compilateur génère ça pour vous en coulisse) mais si vous voulez faire un évènement par exemple, ou quelque chose comme ça, vous devez être explicite à propos de ça.

+3

L'exemple parfait de ce à quoi fait référence BFree pour les événements se trouve dans MVVM, où vous devez augmenter PropertyChanged pour que l'interface graphique reflète la nouvelle valeur de liaison de données. – Dave

4

Tout d'abord, la syntaxe utilisée est nouvelle. Il n'existait pas dans les versions antérieures de C#. Deuxièmement, vous avez besoin de la variable privée si vous voulez avoir une valeur par défaut, ou du chargement paresseux du résultat.

2

Aimez-vous quelqu'un que vous ne connaissez pas avec vos parties intimes? J'espère que non. C'est un moyen de fournir ce qui est essentiellement un proxy pour quelque chose que vous possédez mais que vous ne voulez pas céder le contrôle. Si vous décidez que vous voulez valider que les int sont positifs, vous pouvez commencer à le faire si vous codez comme indiqué. C# rend ceci transparent maintenant avec des propriétés automatiques.

2

Avant C# 3, c'était la seule façon de le faire. Les propriétés typées implicitement n'étaient pas encore disponibles. Les gens voulaient encore faire abstraction du député. Si les développeurs le font encore en C# 3, ils ne sont pas au courant des nouvelles modifications ou ont besoin de fournir une logique get/set personnalisée.

1
public int MyInt{ get; set; } 

était une fonctionnalité ajoutée dans C# 3.0 appelée propriétés automatiques. C# 2.0 ne supporte pas cela et requiert la variable private avec les getters et setters explicites. Par conséquent, beaucoup de code plus ancien ou rétro-compatible utilisera les getters et setters explicites.

2

C'est l'ancienne façon de le faire. La façon dont vous préférez ("propriétés automatiques") est une construction relativement nouvelle dans la langue. Il y a quelques années, nous devions toujours utiliser des variables privées.

Il peut y avoir d'autres raisons d'utiliser des variables privées, mais pas dans l'exemple simple que vous fournissez. Si, par exemple, vous deviez initialiser la propriété avec une valeur par défaut, vous ne pouvez pas vraiment le faire proprement avec des propriétés automatiques; à la place, vous devez initialiser dans les constructeurs.

6

Je voudrais voir

public int MyInt{ get; private set; } 

plus;)

mais @BFree cloué

+0

Eh bien, comment puis-je faire le "jeu privé" alors dans cette classe? – herzmeister

+0

@hdw - vous pouvez le définir dans la classe, vous ne pouvez pas le définir en dehors de la classe. – Steve

+0

J'utilise beaucoup ce modèle dans le cas de classes où j'ai des propriétés de vidage; Cependant, comme mentionné dans d'autres réponses, la propriété automatique exclut toute logique personnalisée qui peut avoir besoin de se produire pendant le get ou l'ensemble. –

1

Si vous regardez la sortie produite par le compilateur avec un outil comme réflecteur un un champ privé a été ajouté

4

Un exemple à développer sur ce que @BFree dit:

private int _Whatever; 
public int Whatever 
{ 
    get {return _Whatever;} 
    set 
    { 
     if(value != _Whatever) 
     { 
      // It changed do something here... 
      // maybe fire an event... whatever 

     } 

     _Whatever = value; 

    } 
} 
Questions connexes