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

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

public abstract Name { get; set; } 

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

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

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

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

 public abstract class Class1 { // Fields [CompilerGenerated] private string k__BackingField; // Methods protected Class1() { } // Properties public string TestString { [CompilerGenerated] get { return this.k__BackingField; } [CompilerGenerated] set { this.k__BackingField = value; } } public abstract string TestStringAbstract { get; set; } } 

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

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

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

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

两者之间有区别:

 public abstract string Name { get; set; } 

 public string Name { get; set; } 

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

第二个声明是一个自动属性,它创建一个支持字段。 它实际上是编译器语法糖的简写:

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