2009-12-09 62 views
5

简单的问题:一个抽象属性创建一个私人后台?例如:抽象属性是否创建一个专用的后台?

public abstract Name { get; set; } 

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

回答

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; } 
} 

正如你可以看到具体的财产只产生一个单一的支持字段。抽象的一个留作定义。

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

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

+0

谢谢,反编译的代码很清楚。你如何用Resharper做到这一点? – 2009-12-09 21:53:47

+0

只是为了避免混淆 - 这是从IL重建的代码* resharper *。它不是**编译器生成的代码。编译器生成IL,而不是C#。 – 2009-12-09 21:55:02

+0

对不起,我不是指Resharper - 我的意思是反射器*从这里(http://www.red-gate.com/products/reflector/)。 我编辑澄清 – 2009-12-09 21:56:36

5

不是。由于它是抽象的,类实现者必须实现该属性。如果实现者这样声明,那么是的,这是一个带有隐藏成员的自动属性来保存实际值。

3

有之间的差异:

public abstract string Name { get; set; } 

public string Name { get; set; } 

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

第二个声明是一个自动属性,它创建一个后台字段。它实际上是编译器语法糖速记:

private string _name; 
public string Name { get { return _name; } set { _name = value; } } 
相关问题