猿问

声明C#属性

我曾经按如下方式设置C#类成员:


public class MyClass

{

    private string member1;


    public string Member1{ get; set; }

}

使用Visual Studio 2017和.NET Framework 4.6.1,当我按照VS2017的建议重构代码时,相同的代码可以很好地工作,但是看起来像这样:


public class MyClass

{

   private string member1;

   public string Member1 { get => member1; set => member1 = value; }

}

我想知道更多的东西的更改get和set性能的意思。



慕尼黑5688855
浏览 192回答 3
3回答

四季花海

属性初始化语法是C#语言的一部分,因此不依赖于.NET Framework版本。您正在使用的Visual Studio版本确实会影响可用的C#版本,但是请注意,例如,可以使用编写最新的C#版本7.x时使用的版本,而不必-当前的Visual Studio 2015。顺便说一句,让我们看一些属性声明。传统的,沼泽标准的字段支持的C#属性声明看起来像这样,尽管理想情况下使用更具描述性的命名:public class MyClass{    private string member1;    public string Member1    {        get { return member1; }        set { member1 = value; }    }}我们有一个公共获取者,它返回了我们的私人支持领域member1;和一个公共设置者来设置我们的私人支持领域。上面的代码很可能是您以前认为使用的代码。这是您提供的代码:public class MyClass{    private string member1;    public string Member1 { get; set; }}...但不是。private string member1;该Member1属性未引用。实际上,在此示例中,member1根本没有引用它,编译器可能会对其进行优化!您真正写的是:public class MyClass{    public string Member1 { get; set; }}上面是C#3.0中引入的自动实现的属性。请注意,get和set关键字后面没有正文。在C#3.0和更高版本中,当属性访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁...当您以这种方式声明属性时,编译器将创建一个私有的匿名后备字段,该字段可以仅可通过属性的get和set访问器进行访问。因此,就像在“传统的沼泽标准字段支持的属性”示例中一样,我们获得了字段支持的属性,只是这次我们不在代码中定义字段,并且该字段对我们来说是匿名的。在编译器中,我们值得信赖!我们快完成了。让我们看看您的新代码:public class MyClass{    private string member1;    public string Member1 { get => member1; set => member1 = value; }}get => member1-这是C#6中引入的具有表达式主体定义的属性get访问器。它只是等价于的语法糖get { return member1; }。set => member1 = value;是具有表达式主体定义的属性集访问器。此语法是在C#7中为设置器引入的。它是的语法糖set { member1 = value; }。为了结束本总结,C#6还引入了用于auto-properties的初始化程序。初始化程序直接初始化后备字段。考虑以下优雅的轻量级代码,以声明和初始化一个简单的(隐藏的,匿名的)字段支持的可读和可写属性:public string Member1 { get; set; } = "I am Member 1!"

潇潇雨雨

您提供的代码示例的主要区别在于member1,该较早示例中的字段实际上未由该Member1属性修改。否则,新语法只是getter和setter的内联实现的另一种选择。
随时随地看视频慕课网APP
我要回答