Propriétés C #: comment utiliser la propriété d'ensemble personnalisée sans champ privé?

93

Je veux faire ça:

public Name
{
    get;
    set
    {
        dosomething();
        ??? = value
    }
}

Est-il possible d'utiliser le champ privé généré automatiquement?
Ou est-il nécessaire que je l'implémente de cette façon:

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        dosomething();
        name = value
    }
}
Peterdk
la source
2
Il y a beaucoup de bonnes discussions à ce sujet à cette question SO: stackoverflow.com/questions/1277018/…
David Hall

Réponses:

102

Une fois que vous voulez faire quelque chose de personnalisé dans le getter ou le setter, vous ne pouvez plus utiliser les propriétés automatiques.

Verre brisé
la source
37

Vous pouvez essayer quelque chose comme ceci:

public string Name { get; private set; }
public void SetName(string value)
{
    DoSomething();
    this.Name = value;
}
Artur Brutjan
la source
6
+1 À mon avis, cette réponse réfute la réponse acceptée. Il utilise les propriétés automatiques. Il définit explicitement setter sur private. C'est une bonne chose car cela permet à l'utilisateur final ou au développeur de savoir qu'il se passe probablement plus derrière la méthode setter.
ooXei1sh
Quelle est la différence entre cela et ne pas avoir pris du tout?
Sidhin S Thomas
3
@SidhinSThomas ne pas fournir de a private setempêcherait la propriété d'être définie par les membres de sa classe; ce serait strictement en lecture seule. Vous ne pourrez définir ses données que dans le constructeur.
Bondolin
15

Ce n'est pas possible. Soit des propriétés implémentées automatiquement, soit du code personnalisé.

Femaref
la source
11

À partir de C # 7, vous pouvez utiliser des définitions de corps d'expression pour la propriété getet les setaccesseurs.

En savoir plus ici

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}
Colin Banbury
la source
4
J'utilise toujours un champ privé. N'aide pas vraiment l'OP.
TSmith
Bien que cela fonctionne, c'est comme @TSmith le dit, ce n'est pas ce que veut l'OP.
M. Ruiz
7

Il est nécessaire que vous l'implémentiez pleinement compte tenu de votre scénario. Les deux getet setdoivent être soit mis en œuvre automatiquement, soit entièrement mis en œuvre ensemble, et non une combinaison des deux.

Jeff Yates
la source