3 回答
TA贡献1811条经验 获得超5个赞
属性初始化语法是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!"
TA贡献1833条经验 获得超4个赞
您提供的代码示例的主要区别在于member1
,该较早示例中的字段实际上未由该Member1
属性修改。
否则,新语法只是getter和setter的内联实现的另一种选择。
- 3 回答
- 0 关注
- 191 浏览
添加回答
举报