2009-12-09 3 views

risposta

7

No, non lo è. Ho appena provato con la seguente classe:

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

    public string TestString { get; set; } 
} 

e decompilato in Reflector. Questo è stato il codice generato:

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

Come si può vedere solo un singolo campo di supporto è stato generato per la proprietà del calcestruzzo. L'astratto è stato lasciato come definizione.

Questo ha senso logico in quanto la proprietà deve essere sovrascritta da qualsiasi classe figlia, non è necessario creare un backing field che non ci sia modo di accedere (poiché non è possibile accedere alla proprietà abstract).

D'altra parte una proprietà virtuale creerà un campo di supporto e qualsiasi classe che sovrascrive la proprietà con una sostituzione auto-implementata creerà il proprio campo di supporto a livello di quella classe.

+0

Grazie, il codice decompilato lo rende molto chiaro. Come lo fai con Resharper? –

+0

Giusto per evitare confusione - questo è il codice * resharper * ricostruito dall'IL. È ** non ** il codice generato dal compilatore. Il compilatore genera IL, non C#. –

+0

Mi dispiace che non intendessi il re-acronimo: intendevo * Reflector * da qui (http://www.red-gate.com/products/reflector/). Ho modificato per chiarire –

5

No. Poiché è astratto, l'implementatore della classe deve implementare la proprietà. Se l'implementatore lo dichiara in quel modo, allora Sì, è una proprietà automatica con un membro nascosto per contenere il valore effettivo.

3

C'è una differenza tra:

public abstract string Name { get; set; } 

e

public string Name { get; set; } 

La prima dichiarazione di proprietà non creare un campo di supporto. Crea solo una proprietà astratta (un po 'come una dichiarazione del metodo dell'interfaccia), che deve essere implementata da qualsiasi classe ereditaria non astratta.

La seconda dichiarazione è una proprietà automatica, che crea un campo di supporto. In realtà è sintassi sintattica dello zucchero del compilatore per:

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