自动实现的属性是否真的在编译时生成私有字段?

时间:2017-01-18 15:32:59

标签: c# .net

enter image description here

使用以下代码编译并运行程序后

class Person
{
    private string surname;

    public string Name { get; set; }
    public string Surname
    {
        get { return surname;}
        set
        {
            surname = value;
        }
    }
}

从图像链接中可以看出,没有"名称"私人领域显示。 只是Visual Studio无法识别它,还是还有其他事情发生?

我已经阅读了很多次"对于你的两个C#例子,一个是另一个的语法糖。"或"编译时将创建一个支持字段。"。

捕获的是什么?

3 个答案:

答案 0 :(得分:4)

调试器不会向您显示支持字段。这并不意味着它不存在,它只是意味着调试器的设计者并不觉得调试代码的人在查看自动属性的私有支持字段时很重要,因为他们可以通过财产本身简单地访问数据。

答案 1 :(得分:2)

借助反射,您可以获得报告实际情况:

 surname
 <Name>k__BackingField

得到

<Name>k__BackingField

正如您所见,编译器为自动属性创建了支持字段http://mvnrepository.com/artifact/javax.mail/mail https://mvnrepository.com/artifact/javax.activation/activation/1.0.2 https://mvnrepository.com/artifact/javax.activation/activation/1.0.2

答案 2 :(得分:0)

我用这个愚蠢的类编译了一个项目:

using System;

namespace ApagueMe
{
    public class Class1
    {
        public string Asdf { get; set; }
    }
}

然后,我在.NET Refletor中打开生成的DLL。看看结果:

public class Class1
{
    // Fields
    [CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private string <Asdf>k__BackingField;

    // Properties
    public string Asdf
    {
        [CompilerGenerated]
        get
        {
            return this.<Asdf>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            this.<Asdf>k__BackingField = value;
        }
    }
}
相关问题