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

Dan*_* T. 5 c# properties abstract

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

public abstract Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ris 7

不,不.我刚刚测试了以下类:

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

    public string TestString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并在Reflector中反编译它.这是生成的代码:

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; }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,只为具体属性生成了一个支持字段.抽象的是作为定义.

这具有逻辑意义,因为属性必须被任何子类覆盖,因此创建一个无法访问的后备字段是没有意义的(因为您无法访问抽象属性).

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


No *_*rns 5

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