C# 抽象属性是否创建私有支持字段?

C# 抽象属性是否创建私有支持字段?,c#,properties,abstract,C#,Properties,Abstract,简单问题:抽象属性是否创建私有支持字段?例如: public abstract Name { get; set; } 这是否会创建一个私人支持字段?我想强制派生此属性的任何类使用它们自己的支持字段,而不是编译器创建的支持字段。否。因为它是抽象的,类实现者必须实现该属性。如果实现者以这种方式声明它,那么是的,它是一个自动属性,有一个隐藏的成员来保存实际值。否,它不是。我刚刚用以下课程进行了测试: public abstract class Class1 { public abstract

简单问题:抽象属性是否创建私有支持字段?例如:

public abstract Name { get; set; }

这是否会创建一个私人支持字段?我想强制派生此属性的任何类使用它们自己的支持字段,而不是编译器创建的支持字段。

否。因为它是抽象的,类实现者必须实现该属性。如果实现者以这种方式声明它,那么是的,它是一个自动属性,有一个隐藏的成员来保存实际值。

否,它不是。我刚刚用以下课程进行了测试:

public abstract class Class1
{
    public abstract string TestStringAbstract { get; set; }

    public string TestString { get; set; }
}
并在中进行了反编译。这是生成的代码:

public abstract class Class1
{
    // Fields
    [CompilerGenerated]
    private string <TestString>k__BackingField;

    // Methods
    protected Class1()
    {
    }

    // Properties
    public string TestString
    {
        [CompilerGenerated]
        get
        {
            return this.<TestString>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            this.<TestString>k__BackingField = value;
        }
    }

    public abstract string TestStringAbstract { get; set; }
}
公共抽象类Class1
{
//田地
[编译生成]
私有字符串k__BackingField;
//方法
受保护类别1()
{
}
//性质
公共字符串测试字符串
{
[编译生成]
得到
{
返回此.k__BackingField;
}
[编译生成]
设置
{
this.k_uubackingfield=值;
}
}
公共抽象字符串TestStringAbstract{get;set;}
}
如您所见,仅为混凝土属性生成了一个支持字段。这个抽象的定义被留下来了

这在逻辑上是有意义的,因为属性必须由任何子类重写。创建无法访问的支持字段没有意义(因为您永远无法访问抽象属性)


另一方面,虚拟属性将创建一个支持字段,任何使用自动实现的替换覆盖该属性的类都将在该类级别创建自己的支持字段。

以下两者之间存在差异:

public abstract string Name { get; set; }

第一个属性声明不创建支持字段。它只创建一个抽象属性(有点像接口方法声明),它必须由任何非抽象继承类实现

第二个声明是一个自动属性,它确实创建了一个支持字段。它实际上是对以下内容的简写:

private string _name;
public string Name { get { return _name; } set { _name = value; } }

谢谢,反编译的代码非常清楚。如何使用Resharper实现这一点?只是为了避免混淆-这是从IL重建的代码Resharper。它不是编译器生成的代码。编译器生成IL,而不是C#。对不起,我不是指Resharper,我是指这里的反射器()。我编辑了clarifyOops,我是说reflector!我知道你的意思,甚至没有注意到这个错误。我的观点仍然站得住脚——它是从编译器生成的IL中重构出来的代码反射器。
private string _name;
public string Name { get { return _name; } set { _name = value; } }