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.
fonte
2009-12-09 21:49:18
Grazie, il codice decompilato lo rende molto chiaro. Come lo fai con Resharper? –
Giusto per evitare confusione - questo è il codice * resharper * ricostruito dall'IL. È ** non ** il codice generato dal compilatore. Il compilatore genera IL, non C#. –
Mi dispiace che non intendessi il re-acronimo: intendevo * Reflector * da qui (http://www.red-gate.com/products/reflector/). Ho modificato per chiarire –