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

时间:2017-10-31 23:29:41

标签: c# visual-studio-2017 .net-4.5

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

public string Name { get => _name; set => _name = value; }

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

public int EmployeeNumber
    {
        get => _employeeNumber;
        set { _employeeNumber = value; OnPropertyChanged("EmployeeNumber");}
    }

比如这样:

public int EmployeeNumber
{
   get => _employeeNumber;
   set =>{ _employeeNumber = value;OnPropertyChanged("EmployeeNumber"); }
}

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

CS1525: Invalid expression term {
CS1002: ; expected
CS1014: A get or set accessor expected

1 个答案:

答案 0 :(得分:12)

好的,让我们再说一遍。你想写

public int EmployeeNumber 
{
    set 
    { 
        _employeeNumber = value;
        OnPropertyChanged("EmployeeNumber");
    } 
}

像这样:

public int EmployeeNumber 
{
    set => 
    { 
        _employeeNumber = value;
        OnPropertyChanged("EmployeeNumber");
    } 
}

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

public int Foo => foo

而不是,

public int Foo { return foo; }

您尝试做的事情并没有使其更具可读性,并添加了两个无用的额外令牌。这似乎是一个可怕的讨价还价。

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

  1. 不返回任何内容(抛出异常是例外,双关语)
  2. 由多个表达组成。
  3. 是否因为它产生的副作用而存在。
  4. 当然规则nº3是我自己的,我不知道有关此问题的任何编码风格建议但我倾向于避免这种语法,除非我没有处理没有副作用产生方法。