繁体   English   中英

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

[英]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

我创建了一个简单的例子来展示差异。 我用不同的属性实现创建了两个类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 - >看看@Arvins的回答)。 同时更改类型会在两个实现中产生完全相同的CIL代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM