2009-12-09 16 views
5

Pregunta simple: ¿una propiedad abstracta crea un campo de respaldo privado? Ejemplo:¿Una propiedad abstracta crea un campo de respaldo privado?

public abstract Name { get; set; } 

¿Esto creará un campo de respaldo privado? Quiero forzar a cualquier clase que derive esta propiedad a usar su propio campo de respaldo, no uno creado por el compilador.

Respuesta

7

No, no lo hace. Acabo de probar con la siguiente clase:

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

    public string TestString { get; set; } 
} 

y decompilados en Reflector. Este fue el código generado:

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

Como puede ver, solo se generó un solo campo de respaldo para la propiedad concreta. El resumen fue dejado como una definición.

Esto tiene sentido lógico ya que la propiedad debe ser anulada por cualquier clase secundaria; no tiene sentido crear un campo de respaldo que no habría forma de acceder nunca (ya que no se puede acceder a la propiedad abstracta).

Por otro lado, una propiedad virtual creará un campo de respaldo y cualquier clase que anule la propiedad con un reemplazo implementado automáticamente creará su propio campo de respaldo en el nivel de esa clase.

+0

Gracias, el código descompilado lo deja muy claro. ¿Cómo se hace eso con Resharper? –

+0

Solo para evitar confusiones, ese es el código * resharper * reconstruido a partir de IL. Es ** no ** el código que generó el compilador. El compilador genera IL, no C#. –

+0

Lo siento, no me refiero a Resharper. Quise decir * Reflector * de aquí (http://www.red-gate.com/products/reflector/). He editado para aclarar –

5

No. Como es abstracto, el implementador de la clase debe implementar la propiedad. Si el implementador lo declara de esa manera, entonces sí, es una propiedad automática con un miembro oculto para mantener el valor real.

3

Hay una diferencia entre:

public abstract string Name { get; set; } 

y

public string Name { get; set; } 

La primera declaración de propiedad no crea un campo respaldo. Simplemente crea una propiedad abstracta (algo así como una declaración de método de interfaz), que debe ser implementada por cualquier clase de herencia no abstracta.

La segunda declaración es una propiedad automática, que SI crea un campo de respaldo. En realidad es taquigrafía sintáctica de azúcar del compilador para:

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