Lambda für Getter und Setter des Eigentums


76

In C # 6.0 kann ich schreiben:

public int Prop => 777;

Aber ich möchte Getter und Setter verwenden. Gibt es eine Möglichkeit, etwas von dem nächsten zu tun?

public int Prop {
   get => propVar;
   set => propVar = value;
}

1
Welches Problem versuchen Sie hier zu lösen? Dies ist für mich nur dann sinnvoll, wenn Sie keine kompliziertere Logik hinzufügen, als einfach den Wert aus / in ein Feld zu laden / speichern. Zu diesem Zeitpunkt würden automatisch implementierte Eigenschaften Ihren Bedarf bereits decken. Welche Art der Implementierung ist Ihrer Meinung nach so kurz, dass sich die =>Syntax lohnt, aber für automatisch implementierte Eigenschaften zu kompliziert ist?

3
Warum verwenden Sie keine Auto-Eigenschaft?
Slugster

1
Es ist nicht ungewöhnlich, dass eine Eigenschaft etwas anderem zugeordnet werden muss, wenn beispielsweise eine Schnittstelle implementiert wird. Der Ausdruck Körperstil hält die Dinge einfach kompakt.
OlduwanSteve

Antworten:


125

Erstens ist das kein Lambda, obwohl die Syntax ähnlich ist.

Es wird " ausdrucksstarke Mitglieder " genannt. Sie ähneln Lambdas, unterscheiden sich aber grundlegend. Offensichtlich können sie lokale Variablen nicht wie Lambdas erfassen. Im Gegensatz zu Lambdas sind sie auch über ihren Namen zugänglich :) Sie werden dies wahrscheinlich besser verstehen, wenn Sie versuchen, eine Eigenschaft mit Ausdruckskörper als Delegat zu übergeben.

In C # 6.0 gibt es keine solche Syntax für Setter, aber C # 7.0 führt sie ein .

private int _x;
public int X
{
    get => _x;
    set => _x = value;
}

Wenn Sie die 6.0-Syntax (public X => _x) verwenden, wird dies in 7.0 weiterhin erkannt? dh dass Sie den Getter angeben, obwohl Sie ihn nicht explizit sagen?
Kevin Victor

1
Sie haben die in der Öffentlichkeit X
Mohammad Reza Biglari

47

C # 7 bietet unter anderem Unterstützung für Setter:

Mehr ausdrucksstarke Mitglieder

Ausdrucksmethoden, Eigenschaften usw. sind in C # 6.0 ein großer Erfolg, aber wir haben sie nicht für alle Arten von Mitgliedern zugelassen. C # 7.0 fügt der Liste der Dinge, die Ausdruckskörper haben können, Accessoren, Konstruktoren und Finalisierer hinzu:

class Person
{
    private static ConcurrentDictionary<int, string> names = new ConcurrentDictionary<int, string>();
    private int id = GetId();

    public Person(string name) => names.TryAdd(id, name); // constructors
    ~Person() => names.TryRemove(id, out _);              // finalizers
    public string Name
    {
        get => names[id];                                 // getters
        set => names[id] = value;                         // setters
    }
}

@ Achilles1515 danke für die Bearbeitung, das Quell-Snippet wurde aktualisiert, um dies zu korrigieren, nachdem ich die Antwort gepostet habe. Ich habe auch den Namen der out-Variablen aktualisiert, um sie an die aktuelle Version des Quell-Snippets anzupassen.
user247702

-6

Es gibt keine solche Syntax, aber die ältere Syntax ist ziemlich ähnlich:

    private int propVar;
    public int Prop 
    {
        get { return propVar; }
        set { propVar = value; }
    }

Oder

public int Prop { get; set; }

14
Dies ist nachweislich nicht wahr, wie die obigen Antworten zeigen.
CodeMonkey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.