C # -Eigenschaften: Wie verwende ich eine benutzerdefinierte Set-Eigenschaft ohne privates Feld?

92

Ich möchte das machen:

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

Ist es möglich, das automatisch generierte private Feld zu verwenden?
Oder muss ich es folgendermaßen implementieren:

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        dosomething();
        name = value
    }
}
Peterdk
quelle
2
Es gibt viele gute Diskussionen darüber in dieser SO-Frage: stackoverflow.com/questions/1277018/…
David Hall

Antworten:

103

Sobald Sie im Getter oder im Setter benutzerdefinierte Aktionen ausführen möchten, können Sie die automatischen Eigenschaften nicht mehr verwenden.

Glassplitter
quelle
36

Sie können so etwas ausprobieren:

public string Name { get; private set; }
public void SetName(string value)
{
    DoSomething();
    this.Name = value;
}
Artur Brutjan
quelle
6
+1 Meiner Meinung nach tadelt diese Antwort die akzeptierte Antwort. Es werden automatische Eigenschaften verwendet. Es setzt den Setter explizit auf privat. Dies ist eine gute Sache, da der Endbenutzer oder Entwickler weiß, dass hinter der Setter-Methode wahrscheinlich mehr steckt.
ooXei1sh
Was ist der Unterschied zwischen diesem und überhaupt nicht eingestellt?
Sidhin S Thomas
2
@SidhinSThomas, das a nicht bereitstellt, private setwürde verhindern, dass die Eigenschaft von den Mitgliedern seiner Klasse festgelegt wird. es wäre streng schreibgeschützt. Sie können die Daten nur im Konstruktor festlegen.
Bondolin
15

Das ist nicht möglich. Entweder automatisch implementierte Eigenschaften oder benutzerdefinierter Code.

Femaref
quelle
11

Ab C # 7 können Sie Ausdruckskörperdefinitionen für die Eigenschaften getund setAccessoren verwenden.

Sehen Sie hier mehr

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}
Colin Banbury
quelle
4
Ich benutze immer noch ein privates Feld. Hilft dem OP nicht wirklich.
TSmith
Während dies funktioniert, ist es wie @TSmith sagt, es ist nicht das, was das OP will.
M. Ruiz
7

Es ist erforderlich, dass Sie es in Ihrem Szenario vollständig implementieren. Beide getund setmüssen entweder automatisch implementiert oder vollständig zusammen implementiert werden, keine Kombination aus beiden.

Jeff Yates
quelle