这是一个新的 C# 6 功能,“Getter-only auto-properties”,也称为“用于只读属性的 Auto-Property Initializers”,如本 MSDN magazine article 'C# : The New and Improved C# 6.0' by Mark Michaelis 和 C# 6.0 draft Language Specification 中所述。
只读字段的设置器只能在构造函数中访问,在所有其他情况下,该字段仍然是只读的并且行为与以前一样。
这是一种方便的语法,可以减少您需要键入的代码量,并且无需显式声明一个私有模块级变量来保存值。
这个特性被认为与 C#3 中引入自动实现的属性一样重要,可变属性(具有 getter 和 setter 的)比不可变的(只有 getter 的)编写起来更快,这意味着人们倾向于使用可变属性来避免必须为只读属性通常需要的支持字段键入代码。在relevant section of the Microsoft C# Programming Guide 中有更多关于自动实现属性的讨论。
This blog post, '#1,207 – C# 6.0 – Auto-Property Initializers for Read-Only Properties' by Sean Sexton有很好的解释和例子如下:
在 C# 6.0 之前,如果你想要一个只读(不可变)属性,你会
通常使用在
构造函数,如下所示。
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
private readonly DateTime creTime;
public DateTime DogCreationTime
{
get { return creTime; }
}
public Dog(string name)
{
Name = name;
creTime = DateTime.Now;
}
}
在 C# 6.0 中,您可以使用自动实现的属性来实现
只读属性。您可以使用自动属性来执行此操作
初始化器。结果比上面的例子干净得多,其中
我们必须明确声明一个支持字段。
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
public DateTime DogCreationTime { get; } = DateTime.Now;
public Dog(string name)
{
Name = name;
}
}
更多详情也可以在the dotnet Roslyn repo on GitHub:
现在可以在没有设置器的情况下声明自动属性。
getter-only 自动属性的支持字段是隐式的
声明为只读(尽管这只对反射很重要
目的)。可以通过初始化器初始化
属性如上例所示。此外,只有 getter 的属性可以是
在声明类型的构造函数体中赋值,这会导致
要直接分配给基础字段的值:
这是关于更简洁地表达类型,但请注意它也
消除了 mutable 和
不可变类型:自动属性是一种简写形式,仅当
你愿意让你的类是可变的,所以诱惑
默认情况下很棒。现在,有了 getter-only 自动属性,
竞争环境已在可变和不可变之间拉平。
在C# 6.0 draft Language Specification 中(注意:就微软而言,语言规范是最终版本,但它是yet to be approved as a EMCA/ISO standard,因此是“草案”):
自动实现的属性
一个自动实现的属性(或简称自动属性),是
具有仅分号访问器的非抽象非外部属性
身体。自动属性必须有一个 get 访问器,并且可以选择
有一个 set 访问器。
当一个属性被指定为一个自动实现的属性时,
隐藏的支持字段自动可用于该属性,
并且访问器被实现为读取和写入
支持领域。如果自动属性没有设置访问器,则支持
字段被认为是只读的(只读字段)。就像一个只读的
字段,也可以在正文中分配仅 getter 的自动属性
封闭类的构造函数。这样的任务分配
直接到属性的只读支持字段。
自动属性可以有一个property_initializer,它是
作为 variable_initializer 直接应用于支持字段
(变量初始化器)。