getter-only自动属性和expression式主体属性有什么区别?

在C#6中,可以通过使用getter-only自动属性来简化实现属性。 例如,如果我正在实现抽象的Stream类:

 public override bool CanRead { get; } = true; 

不过,我也可以用一个expression式体来编写它,在C#6中也是新的:

 public override bool CanRead => true; 

两者有什么区别,我应该什么时候使用其中一种?

他们是两种不同的东西的句法糖。 前者初始化后台字段,并在字段初始化期间将其设置为赋值右侧的expression式。 后者创build了一个完整的expression式。

 public override bool CanRead { get; } = true; 

相当于

 private readonly bool __backingFieldCanRead = true; public override bool CanRead { get { return __backingFieldCanRead; } } 

这个

 public override bool CanRead => true; 

相当于

 public override bool CanRead { get { return true; } } 

他们的行为有所不同。 第一种情况是在创build对象并初始化字段时设置属性的值,另一种情况是每次调用属性的getter时评估expression式。 在布尔的简单情况下,行为是相同的。 但是,如果expression式导致副作用,情况就不同了。 考虑这个例子:

 class Program { static void Main(string[] args) { var fooBar1 = new FooBar(); Console.WriteLine(fooBar1.Baz); Console.WriteLine(fooBar1.Baz); var fooBar2 = new FooBar(); Console.WriteLine(fooBar2.Baz); Console.WriteLine(fooBar2.Baz); } } public class FooBar { private static int counter; public int Baz => counter++; } 

这里打印“0,1,2,3”。 每当属性的getter被调用时,静态counter字段就会增加。 但是,使用属性初始值设定项:

 public int Baz { get; } = counter++; 

然后打印“0,0,1,1”,因为在对象的构造函数中计算expression式。