简单问题:抽象属性是否创建了私有支持字段?例如:
public abstract Name { get; set; }
这会创建一个私人支持领域吗?我想强制任何派生此属性的类使用自己的支持字段,而不是编译器创建的支持字段。
答案 0 :(得分:7)
不,不。我刚用以下课程测试过:
public abstract class Class1
{
public abstract string TestStringAbstract { get; set; }
public string TestString { get; set; }
}
并在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; }
}
正如您所看到的,只为具体属性生成了一个支持字段。抽象的是作为定义。
这具有逻辑意义,因为该属性必须被任何子类覆盖,因此创建一个无法访问的后备字段是没有意义的(因为您无法访问抽象属性)。
另一方面,虚拟属性将创建一个支持字段,任何使用自动实现的替换覆盖该属性的类将在该类的级别创建自己的支持字段。
答案 1 :(得分:5)
没有。由于它是抽象的,所以类实现者必须实现该属性。如果实现者以这种方式声明它,那么是,它是一个自动属性,带有隐藏成员来保存实际值。
答案 2 :(得分:3)
之间有区别:
public abstract string Name { get; set; }
和
public string Name { get; set; }
第一个属性声明不会创建支持字段。它只是创建一个抽象属性(有点像接口方法声明),它必须由任何非抽象的继承类实现。
第二个声明是一个自动属性,它会创建一个支持字段。它实际上是编译器语法糖的简写:
private string _name;
public string Name { get { return _name; } set { _name = value; } }