属性初始化语法是 C# 语言的一部分,因此不依赖于 .NET Framework 版本。您使用的 Visual Studio 版本确实会影响您可用的 C# 版本,但请注意,例如,可以使用编写最新 C# 版本时的版本 - 7.x - with the not-current Visual Studio 2015。
说完这些,让我们看看一些属性声明。
传统的、沼泽标准的字段支持 C# 属性声明看起来像这样,尽管理想情况下具有更具描述性的命名:
public class MyClass
{
private string member1;
public string Member1
{
get { return member1; }
set { member1 = value; }
}
}
我们有一个公共 getter,它返回我们的私有支持字段 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; }
}
上面是auto-implemented property,在 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 - 这是一个带有expression body definition 的属性获取访问器,如C# 6 中所介绍的那样。它只是相当于get { return member1; } 的语法糖。
set => member1 = value; 是具有表达式主体定义的属性集访问器。此语法是在 C# 7 中为 setter 引入的。它是 set { member1 = value; } 的语法糖。
为了结束这个总结,C# 6 还引入了initializers for auto-properties。初始化程序直接初始化支持字段。考虑这个优雅的轻量级代码来声明和初始化一个简单的(隐藏的、匿名的)字段支持的可读可写属性:
public string Member1 { get; set; } = "I am Member 1!"