带有新getter/setter语法的VS2017:如何在setter中写多行?/

Sun*_*ita 4 c# .net-4.5 visual-studio-2017

我使用的是.NET Framework 4.5.2,VS2017.VS2017获得了getter和setter的新语法.现在具有getter setter的属性如下所示:

public string Name { get => _name; set => _name = value; }
Run Code Online (Sandbox Code Playgroud)

我必须写下面的属性.如何用lambda表达式set =>编写setter?

public int EmployeeNumber
    {
        get => _employeeNumber;
        set { _employeeNumber = value; OnPropertyChanged("EmployeeNumber");}
    }
Run Code Online (Sandbox Code Playgroud)

比如这样的事情:

public int EmployeeNumber
{
   get => _employeeNumber;
   set =>{ _employeeNumber = value;OnPropertyChanged("EmployeeNumber"); }
}
Run Code Online (Sandbox Code Playgroud)

对于上面的setter,我得到3个错误:

CS1525: Invalid expression term {
CS1002: ; expected
CS1014: A get or set accessor expected
Run Code Online (Sandbox Code Playgroud)

InB*_*een 12

好的,让我们再看一遍.你想写

public int EmployeeNumber 
{
    set 
    { 
        _employeeNumber = value;
        OnPropertyChanged("EmployeeNumber");
    } 
}
Run Code Online (Sandbox Code Playgroud)

像这样:

public int EmployeeNumber 
{
    set => 
    { 
        _employeeNumber = value;
        OnPropertyChanged("EmployeeNumber");
    } 
}
Run Code Online (Sandbox Code Playgroud)

问题是为什么?关于表达身体功能成员的全部观点是使事情更简洁和可读,避免花括号,返回关键字等:

public int Foo => foo
Run Code Online (Sandbox Code Playgroud)

代替,

public int Foo { return foo; }
Run Code Online (Sandbox Code Playgroud)

你试图做的事情并没有使它更具可读性,并增加了两个无用的额外令牌.这似乎是一个可怕的讨价还价.

作为一般规则,=>在右侧的代码中不应使用(或不能使用)语法:

  1. 不返回任何内容(抛出异常是例外,双关语意图)
  2. 由多个表达式组成.
  3. 是否因为它产生的副作用.

当然规则nº3是我自己的,我不知道关于这个问题的任何编码风格的建议,但我倾向于避免这种语法,除非我没有处理没有副作用产生方法.

  • @Mick我倾向于不同意,如果用得好,它会做很多代码.我更喜欢`public override int GetHashCode()=> X ^ Y;`over`public override int GetHashCode(){return X ^ Y; 任何时候.我们可以没有它吗?是的,但我发现它很方便. (2认同)
  • 我认为将=>用于表示身体健全的成员是一个糟糕的选择。将有很多普通的开发人员将其与lambda混淆,并认为两者之间存在某种联系。这并不是引入新的构造,而是为现有构造创建了一个可能令人困惑的新语法。每个都有自己的功能,但是作为必须与普通开发人员打交道的人,我看不到使用它的价值。 (2认同)