web-dev-qa-db-fra.com

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

J'ai récemment appris le c #, donc 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 automatiques sont super! Mais maintenant, j'essaie de faire quelque chose d'un peu plus compliqué, j'ai donc besoin d'écrire une paire d'accessoires personnalisée.

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

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

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

51
Tin Can

Les propriétés n'ont pas du tout besoin de variables de sauvegarde (champs). 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 l'objectif est d'encapsuler simplement un champ avec une propriété, vous aurez besoin d'une sorte de champ de sauvegarde si vous n'utilisez pas de propriétés automatiques.

38
jhappoldt

La réponse est non, vous ne pouvez pas le faire. C'est à cause de la récursivité. (Voir les lignes 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 :   }
11
tika

Non, j'en ai bien peur. Le compilateur est suffisamment intelligent pour que cela se produise pour vous sur les propriétés générées automatiquement, mais avec des 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 se passe-t-il 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 support? Pourquoi? Il n'en a pas besoin.

De plus, si la valeur privée n'est pas créée avant la compilation, qu'allez-vous référencer dans votre code:

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

Quel est _Name? Et si vous avez une autre valeur ailleurs appelée _Name? Alors, comment le compilateur appellerait-il la valeur de support pour cette propriété? Et 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
  }
}

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

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

10
David