[英]Get-only property with constant value, auto-property or not?
以下两个属性声明之间是否存在性能/内存使用差异,是否应首选?
public bool Foo => true;
public bool Foo { get; } = true;
另外,如果使用不同的不可变值(例如字符串)替换布尔值,情况是否会发生变化?
我写这个课作为一个例子
class Program
{
public bool A => true;
public bool B { get; } = true;
}
用反射我反编译程序集并获取此代码
class Program
{
// Fields
[CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly bool <B>k__BackingField = true;
public bool A
{
get
{
return true;
}
}
public bool B
{
[CompilerGenerated]
get
{
return this.<B>k__BackingField;
}
}
}
因此@Fruchtzwerg提到两种方式都有相同的方式来返回值但是差异在于getter方法的实现,因为一个返回值ture
而另一个返回一个值为true
的字段。
谈论性能和内存第一种方式似乎更好,但如果你只需要这个属性是true
我建议使用const
。
我创建了一个简单的例子来展示差异。 我用不同的属性实现创建了两个类A
和B
public class A
{
public bool Foo => true;
}
public class B
{
public bool Foo { get; } = true;
}
应该使用这些类的简单测试代码来显示生成的CIL代码的差异:
A a = new A();
B b = new B();
bool c;
c = a.Foo;
c = b.Foo;
反汇编显示以下代码:
c = a.Foo;
00C50FB0 mov ecx,dword ptr [ebp-40h]
00C50FB3 cmp dword ptr [ecx],ecx
00C50FB5 call 00C50088
00C50FBA mov dword ptr [ebp-54h],eax
00C50FBD movzx eax,byte ptr [ebp-54h]
00C50FC1 mov dword ptr [ebp-48h],eax
c = b.Foo;
00C50FC4 mov ecx,dword ptr [ebp-44h]
00C50FC7 cmp dword ptr [ecx],ecx
00C50FC9 call 00C500A8
00C50FCE mov dword ptr [ebp-58h],eax
00C50FD1 movzx eax,byte ptr [ebp-58h]
00C50FD5 mov dword ptr [ebp-48h],eax
这意味着没有区别 (除了第3行的getter - >看看@Arvins的回答)。 同时更改类型会在两个实现中产生完全相同的CIL代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.