2009-12-09 51 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; } }