C# VS2017中的Getter和Setter

3
我最近开始使用VS2017 Community。以下是我对它的困扰:
下面是之前版本的常规Getter Setter:
public string Name
    {
        get{ return _name;}
        set{ _name = value;}
    }

这是新的getter setter:

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

有人可以解释一下为什么语法被改变了吗?

4个回答

3

我不会说他们改变了它,我会说他们给了我们一些新的语法选项。你仍然可以使用“旧”的声明getter和setter的方式,但现在也有一种更加功能式编程的方式。在C#6中,Microsoft已经引入了使用表达式来声明只读属性的方法:

public int SomeProp => someMethod(); 

C#7增强了支持,允许其用于属性的获取器和设置器。其中一个很好的特性是使用新的“throw表达式”功能可以使语法更加简洁。例如,在此之前,必须使用以下方式:

private string _name;
public string Name
{
    get
    {
        return _name;
    }
    set
    {
        if (value == null)
            throw new ArgumentNullException(nameof(Name));
        _name = value;
    }
}

我们现在可以把它简化为:
private string _name;
public string Name { 
    get => _name; 
    set => _name = value ?? throw new ArgumentNullException(nameof(Name)); 
}

当然,即使不使用lambda表达式也可以执行throw操作,但是如你所见,对于简单的操作,它使语法非常简洁。
像任何东西一样,请使用对您最有意义且最易于阅读的语法来编写应用程序代码。微软一直在推动向C#中添加越来越多的函数式编程风格特性,这只是其中的一个例子。如果您认为它难看/混乱/不需要,完全可以使用现有方法实现所需的所有功能。另一个例子是,为什么我们有while和do while循环?我可以诚实地说,我在我的职业生涯中可能只使用过5次do while循环。while循环可以做到do while循环能做到的一切,只是采用了不同的语法。然而,有时您会意识到使用do while将使您的代码更易读,那么,如果它可以使事情更容易跟随,为什么不使用它呢?

1
语法并没有改变,而是得到了改进。C#一直向后兼容以前版本的语法和语法规则。
为什么属性getter/setter可以使用lambda语法(表达式体访问器)实现?可能没有科学理由这样做,但对于引入有用的函数式编程构造到C#中,存在共识,因为这使语言成为一个更加高效的工具。
只需跟随C#2.0之后的演变:
- 从提供为常规方法的委托到匿名委托。 - LINQ,lambda样式的委托/表达式树。 - 表达式体方法。 - ...和表达式体访问器!并且未来的C#版本可能会引入更多的函数式编程风格的语法和语法规则。

0

我知道我在一年后才添加这些细节,但我刚明白我的VS 2017在我的Web用户控件上生成了新的语法,当我想为其设置一个值时,在aspx文件上并没有反映。

就像 private bool _ShowBankDetailPanel = false; // 在注册中显示银行详细信息部分 public bool ShowBankDetailPanel { get => _ShowBankDetailPanel; set => _ShowBankDetailPanel = value; }

而在ASPX方面,您将没有类似的属性

仅识别旧式的getter和setter…(我经历过这个,但我可能是错误的)


0
你会注意到他们删除了“return”语法,这是为了更清楚地表明它们不是函数(当反映时不能被视为函数,也不能被转换为委托),而是这种“伪函数”(如果你明白我的意思的话)。
所以基本上这是为了更清楚地表明getter正在链接这个变量,setter也是如此。这也是因为在更新的版本中,你可以做类似于 public int MyInt => x ? y:z; 这代表
public int MyInt
{
    get
    {
        return x ? y:z;
    }
}

同时两种语法都可以使用,只是新的语法是为了与上面的例子保持一致。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接