具有常量值,自动属性的Get-only属性?

时间:2017-08-06 15:26:29

标签: c# properties

以下两个属性声明之间是否存在性能/内存使用差异,是否应首选?

public bool Foo => true;

public bool Foo { get; } = true;

此外,如果使用不同的不可变值(例如字符串)替换布尔值,情况会发生变化吗?

2 个答案:

答案 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)

我创建了一个简单的例子来展示差异。我使用不同的属性实现创建了两个类AB

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代码。