getter-only 自动属性和表达式主体属性有什么区别?
What is the difference between getter-only auto properties and expression body properties?
在 C# 6 中,您可以通过使用仅 getter 的自动 属性 来简化 属性 的实现。例如,如果我正在实现抽象 Stream
class:
public override bool CanRead { get; } = true;
但是我也可以用表达式主体来编写它,这也是 C# 6 中的新功能:
public override bool CanRead => true;
两者有什么区别,什么时候应该使用其中之一?
它们是两种不同事物的语法糖。前者初始化一个支持字段,并在字段初始化期间将其设置为赋值右侧的表达式。后者创建一个 get
,它完全符合表达式中的内容。
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;
}
}
他们的行为不同。第一种情况在创建对象和初始化字段时设置 属性 的值,另一种情况在每次调用 属性 的 getter 时计算表达式。在 bool 的简单情况下,行为是相同的。但是,如果表达式引起副作用,情况就不同了。考虑这个例子:
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”,因为表达式是在对象的构造函数中求值的。
对于你在我们例子中描述的情况,我以前更喜欢:
public override bool CanRead { get; } = true;
但今天我通知此实现会导致为支持字段分配内存。因此,此实现:bool CanRead => true;
可以节省 4 个字节。
在 C# 6 中,您可以通过使用仅 getter 的自动 属性 来简化 属性 的实现。例如,如果我正在实现抽象 Stream
class:
public override bool CanRead { get; } = true;
但是我也可以用表达式主体来编写它,这也是 C# 6 中的新功能:
public override bool CanRead => true;
两者有什么区别,什么时候应该使用其中之一?
它们是两种不同事物的语法糖。前者初始化一个支持字段,并在字段初始化期间将其设置为赋值右侧的表达式。后者创建一个 get
,它完全符合表达式中的内容。
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;
}
}
他们的行为不同。第一种情况在创建对象和初始化字段时设置 属性 的值,另一种情况在每次调用 属性 的 getter 时计算表达式。在 bool 的简单情况下,行为是相同的。但是,如果表达式引起副作用,情况就不同了。考虑这个例子:
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”,因为表达式是在对象的构造函数中求值的。
对于你在我们例子中描述的情况,我以前更喜欢:
public override bool CanRead { get; } = true;
但今天我通知此实现会导致为支持字段分配内存。因此,此实现:bool CanRead => true;
可以节省 4 个字节。