加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#属性是否始终具有“幕后”的备份字段?

发布时间:2020-12-15 18:18:32 所属栏目:百科 来源:网络整理
导读:我知道当我们在C#中使用属性时,编译器总是在MSIL中为它们生成getter和setter(例如,get_PropertyName和set_PropertyName),例如,考虑以下代码: class Program { class Test { public string Name { get; set; } } static void Main(string[] args) { //Here I
我知道当我们在C#中使用属性时,编译器总是在MSIL中为它们生成getter和setter(例如,get_PropertyName和set_PropertyName),例如,考虑以下代码:
class Program
    {
        class Test
        {
            public string Name { get; set; }
        }
        static void Main(string[] args)
        {
            //Here I'm using reflection to inspect methods of Test class
            Type type = typeof(Test);
            foreach (var item in type.GetMethods())
            {
                Console.WriteLine(item.Name);
            }
        }
    }

这个程序将使用Test的方法生成输出,其中将有get_Name和set_Name – 我正在讨论的getter和setter.
在我的理解中,如果getter和setter是在“幕后”创建的,那么应该创建一个备用字段,getter和setter获取/设置值.
因此,从前面的示例中,我可以使用反射来检查Test类的字段,如下所示:

static void Main(string[] args)
    {
        Type type = typeof(Test);
        foreach (var item in type.GetFields())
        {
            Console.WriteLine(item.Name);
        }
    }

这个程序的输出是空的,我认为这是因为创建的备份字段具有私有访问权限,因此我们无法看到它.但由于我不知道如何检查它,你能告诉我是否总是创建一个备份字段(即使我们有一个只有get的简单属性;并设置;)?

解决方法

如果你的意思是简单的属性:
{get;set;}

要么:

{get;}

然后是的,有一个领域;添加BindingFlags.NonPublic | BindingFlags.Instance到你的GetFields()调用,你会看到它:

foreach (var item in type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
{
    Console.WriteLine(item.Name);
}

它通常有一个不可启动的名称,涉及<> – 你的是< Name> k__BackingField在我的机器上 – 但是:这个名字是一个编译器功能(虽然很多序列化等库都使用它,所以它不太可能改变).

但是:不,财产本身并不总是涉及领域;例如:

public int Value => 42; // no field

要么

public int Name { get { return obj.Name; } set { obj.Name = value; } }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读