C # getter/setter personnalisé sans variable privée

J'ai appris le c# récemment, alors quand j'ai appris à écrire des propriétés, on m'a appris à le faire comme ceci:

public string Name { get; set; }

Les propriétés Auto sont géniales! Mais maintenant, j'essaie de faire quelque chose d'un peu plus compliqué, donc j'ai besoin d'écrire une paire d'accesseurs personnalisés.

private string _Name;
public string Name {
    get { return _Name; }
    set { _Name = value }
}

Je sais que le compilateur fait une variable d'instance privée dans ses profondeurs troubles quand on utilise des autos, mais je suis gâté et je ne veux pas que cette variable privée soit inutile.

Est-il un moyen d'utiliser accesseurs personnalisés sans variable privée?

42
demandé sur Tin Can 2011-12-20 19:15:05

3 réponses

Les propriétés n'ont pas besoin de variables de sauvegarde (champs) du tout. Bien qu'ils puissent être utilisés pour encapsuler des champs simples, vous pouvez également les utiliser pour accéder à d'autres données.

public Decimal GrandTotal { get { return FreightTotal + TaxTotal + LineTotal; } }

Ou

public string SomeStatus { get { return SomeMethodCall(); } }

Si le but est simplement d'encapsuler un champ avec une propriété, vous auriez besoin d'une sorte de champ de sauvegarde si vous n'utilisez pas de propriétés automatiques.

32
répondu jhappoldt 2011-12-20 15:25:40

Non, Je crains que non. Le compilateur est assez intelligent pour que cela se produise pour vous sur les propriétés générées automatiquement, mais avec les propriétés standard, j'imagine que la logique derrière quelque chose comme ça finirait par gêner et faire plus de mal que de bien.

Par exemple, que faire si je crée une propriété comme celle-ci...

public int SomeValue
{
  get
  {
    return 0;
  }
}

Le compilateur (avec la fonctionnalité que vous recherchez) créerait-il une variable privée de sauvegarde? Pourquoi? Il n'en a pas besoin.

En outre, si le la valeur n'est pas créée avant le moment de la compilation, qu'allez-vous référencer dans votre code:

public string Name {
  get { return _Name; }
  set { _Name = value }
}

Qu'est-Ce que _Name? Que faire si vous avez une autre valeur ailleurs appelée _Name? Alors, qu'est-ce que le compilateur appellerait la valeur de sauvegarde pour cette propriété? Que faire si j'ai besoin de deux valeurs de sauvegarde? Le compilateur serait - il assez intelligent pour cela?

public string Name
{
  get
  {
    return string.Format("{0} {1}", _FirstName, _LastName);
  }
  set
  {
    // some parsing magic
  }
}

On L'a déjà demandé, mais j'imagine que la réponse continuera d'être "non" dans un avenir prévisible.

Un auto-propriété est un raccourci syntaxique pour un accès direct simple membre. (Et j'imagine que l'une de ses forces motrices était simplement d'essayer d'amener les gens à arrêter de créer directement des valeurs public.) Les propriétés peuvent croître en complexité bien au-delà très facilement et personnellement, je ne voudrais pas que le compilateur essaie de comprendre ce que je peux facilement lui dire de faire.

10
répondu David 2011-12-20 15:28:19

La réponse est Non, vous ne pouvez pas le faire. C'est à cause de la récursivité. (Voir les numéros de ligne 9 et 7):

Line 1  :   public string Name
Line 2  :   {
Line 3  :     get
Line 4  :     {
Line 5  :         return FirstName + " "  + LastName;
Line 6  :     }
Line 7  :     set
Line 8  :     {
Line 9  :         Name = value; // <-- Goes back to Line 7
Line 10 :     }
Line 11 :   }
8
répondu tika 2018-03-05 17:31:30