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式。