web-dev-qa-db-fra.com

Lambda pour getter et setter de la propriété

En C # 6.0, je peux écrire:

public int Prop => 777;

Mais je veux utiliser getter et setter. Y a-t-il un moyen de faire quelque chose du genre la prochaine?

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

Tout d’abord, ce n’est pas lambda, bien que la syntaxe soit similaire.

Cela s'appelle " membres avec expression ". Ils ressemblent aux lambdas mais sont fondamentalement différents. De toute évidence, ils ne peuvent pas capturer les variables locales comme le font les lambdas. En outre, contrairement aux lambdas, ils sont accessibles via leur nom :) Vous le comprendrez probablement mieux si vous essayez de transmettre une propriété contenant une expression en tant que délégué.

Une telle syntaxe n'existe pas pour les setters dans C # 6.0, mais C # 7.0 le présente .

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

C # 7 apporte un soutien aux setters, parmi d'autres membres:

Plus d'expression des membres corsés

Les méthodes, propriétés, etc., avec corps d'expression sont un succès en C # 6.0, mais nous ne les avons pas autorisées dans toutes sortes de membres. C # 7.0 ajoute des accesseurs, des constructeurs et des finaliseurs à la liste des objets pouvant avoir un corps d'expression:

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
    }
}
34
user247702

Il n'y a pas de telle syntaxe, mais l'ancienne syntaxe est assez similaire:

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

Ou

public int Prop { get; set; }
0
Marcin Iwanowski