Mik*_*und 7 c# automatic-properties c#-6.0
在C#6.0中,新语法允许我们使用初始化程序编写只读自动属性:
public bool AllowsDuplicates { get; } = true;
Run Code Online (Sandbox Code Playgroud)
同样,我们可以使用表达式body getter来编写它:
public bool AllowsDuplicates => true;
Run Code Online (Sandbox Code Playgroud)
对于简单类型,这两个应该具有相同的效果:返回true的只读自动属性.
但是他们中的一个比另一个更受欢迎吗?我怀疑前者使用了支持字段:
private readonly bool _backingField = true;
public bool AllowsDuplicates {
get {
return _backingField;
}
}
Run Code Online (Sandbox Code Playgroud)
而后者变成了类似的东西:
public bool AllowsDuplicates {
get {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的,还是编译器比这更聪明?
我怀疑前者使用了支持领域
自动属性初始化程序实际上创建了一个支持字段!你可以在ILSpy中抛出它并在输出中看到它:
public class One
{
public bool AllowsDuplicates
{
[CompilerGenerated]
get
{
return this.<AllowsDuplicates>k__BackingField;
}
}
public One()
{
this.<AllowsDuplicates>k__BackingField = true;
base..ctor();
}
}
public class Two
{
public bool AllowsDuplicates
{
get
{
return true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是他们中的一个比另一个更受欢迎吗?
对于问题中的特定示例,auto-property将允许构造函数请求bool并分配它.第二种风格不会.如果意图将其用作"默认值",可以在构造期间修改一次,那么自动属性是正确的选择.
class Test
{
// Could assign this in the second constructor
public bool AllowsDuplicates { get; } = true;
// Cannot assign this in the second constructor
public bool AllowsDuplicates => true;
public Test()
{
// Default value used
}
public Test(bool value)
{
AllowsDuplicates = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经看到表达体的语法胜出最多,因为它是一个用作属性的小函数的掩护.Eric Lippert的dedoublifier中的一个结构有一个很好的例子:
public DoubleHelper(double d)
{
this.RawBits = (ulong)BitConverter.DoubleToInt64Bits(d);
}
public ulong RawBits { get; }
// RawSign is 1 if zero or negative, 0 if zero or positive
public int RawSign => (int)(RawBits >> 63);
public int RawExponent => (int)(RawBits >> 52) & 0x7FF;
public long RawMantissa => (long)(RawBits & 0x000FFFFFFFFFFFFF);
public bool IsNaN => RawExponent == 0x7ff && RawMantissa != 0;
public bool IsInfinity => RawExponent == 0x7ff && RawMantissa == 0;
public bool IsZero => RawExponent == 0 && RawMantissa == 0;
public bool IsDenormal => RawExponent == 0 && RawMantissa != 0;
Run Code Online (Sandbox Code Playgroud)
在构造函数中分配了一个值,其余的是基于它计算的属性值.
| 归档时间: |
|
| 查看次数: |
630 次 |
| 最近记录: |