简单的问题:抽象属性是否创建了私有支持字段?例子:
public abstract Name { get; set; }
这会创建一个私有的支持字段吗?我想强制派生此属性的任何类使用它们自己的支持字段,而不是由编译器创建的支持字段。
简单的问题:抽象属性是否创建了私有支持字段?例子:
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 <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; }
}
如您所见,只为具体属性生成了一个支持字段。抽象的保留作为定义。
这是合乎逻辑的,因为该属性必须被任何子类覆盖,因此创建一个永远无法访问的支持字段是没有意义的(因为您永远无法访问抽象属性)。
另一方面,虚拟属性将创建一个支持字段,并且任何使用自动实现的替换覆盖该属性的类都将在该类的级别创建自己的支持字段。
不,因为它是抽象的,所以类实现者必须实现该属性。如果实现者以这种方式声明它,那么是的,它是一个带有隐藏成员的自动属性来保存实际值。
两者之间有区别:
public abstract string Name { get; set; }
和
public string Name { get; set; }
第一个属性声明不会创建支持字段。它只是创建了一个抽象属性(有点像接口方法声明),它必须由任何非抽象继承类来实现。
第二个声明是一个自动属性,它确实创建了一个支持字段。它实际上是编译器语法糖的简写:
private string _name;
public string Name { get { return _name; } set { _name = value; } }