Lambda用于财产的获取和设定


76

在C#6.0中,我可以编写:

public int Prop => 777;

但是我想使用getter和setter。有什么办法可以做下一个?

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

1
您要在这里解决什么问题?仅当您不添加任何简单的逻辑而不是简单地从字段中加载/存储值时,这对我才有意义,此时自动实现的属性已经可以满足您的需求。您想到的是什么类型的实现,它太短以至于=>值得使用语法,但是对于自动实现的属性却太复杂了?

3
为什么不使用汽车物业?
slugster '16

1
例如,在实现接口时,通常需要将属性映射到其他对象。表达体式只是使事情紧凑。
OlduwanSteve

Answers:


125

首先,虽然语法相似,但这不是lambda。

它被称为“表情健全的成员”。它们与lambda相似,但仍存在根本差异。显然,它们无法像lambdas那样捕获局部变量。此外,与lambda不同,它们可以通过名称访问:)如果尝试将表达式主体属性作为委托传递,则可能会更好地理解这一点。

C#6.0中没有针对setter的语法,但是C#7.0引入了它

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

如果您使用6.0语法(公共X => _x),那么在7.0中仍可以识别吗?也就是说,即使您没有明确地说出您正在指定吸气剂?
KevinVictor '19

1
您忘记了int公共X
Mohammad Reza Biglari

47

C#7带来了对setter的支持,以及其他成员:

更多表情浓郁的成员

表达式合并的方法,属性等在C#6.0中很受欢迎,但是我们不允许所有类型的成员使用它们。C#7.0将访问器,构造函数和终结器添加到可以具有表达式主体的事物列表中:

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感谢您的编辑,在我发布答案后,源代码片段已更新以更正此错误。我还更新了out变量名称,以匹配源代码片段的当前版本。
user247702

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.