在C#6中,您可以通过使用仅限getter的自动属性来简化属性的实现.例如,如果我正在实现抽象Stream类:
public override bool CanRead { get; } = true;
Run Code Online (Sandbox Code Playgroud)
但是我也可以用表达式体写它,在C#6中也是新的:
public override bool CanRead => true;
Run Code Online (Sandbox Code Playgroud)
两者之间有什么区别,什么时候应该使用其中一个?
vcs*_*nes 63
它们是两种不同东西的语法糖.前者初始化后备字段,并在字段初始化期间将其设置为赋值右侧的表达式.后者创建了一个get完全符合表达式的内容.
public override bool CanRead { get; } = true;
Run Code Online (Sandbox Code Playgroud)
相当于
private readonly bool __backingFieldCanRead = true;
public override bool CanRead
{
get
{
return __backingFieldCanRead;
}
}
Run Code Online (Sandbox Code Playgroud)
这个
public override bool CanRead => true;
Run Code Online (Sandbox Code Playgroud)
相当于
public override bool CanRead
{
get
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
他们的行为不同.第一种情况在创建对象并初始化字段时设置属性的值,另一种情况在每次调用属性的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++;
}
Run Code Online (Sandbox Code Playgroud)
这里,打印"0,1,2,3".counter每次调用属性的getter时,静态字段都会递增.但是,使用属性初始值设定项:
public int Baz { get; } = counter++;
Run Code Online (Sandbox Code Playgroud)
然后打印"0,0,1,1",因为表达式是在对象的构造函数中计算的.
| 归档时间: |
|
| 查看次数: |
3709 次 |
| 最近记录: |