以下两个属性声明之间是否存在性能/内存使用差异,是否应首选?
public bool Foo => true;
public bool Foo { get; } = true;
此外,如果使用不同的不可变值(例如字符串)替换布尔值,情况会发生变化吗?
答案 0 :(得分:4)
我写这个课作为例子
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
而另一个返回a字段,其值为true
。
谈论性能和内存时,第一种方式似乎更好,但如果您只需要此属性true
,我建议使用const
。
答案 1 :(得分:2)
我创建了一个简单的例子来展示差异。我使用不同的属性实现创建了两个类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 - &gt;看看@Arvins的回答)。同时更改类型会在两个实现中产生完全相同的CIL代码。