2010-07-17 11 views
9

Por un lado, sé que el uso conveniente de las propiedades es tener un campo de respaldo, como en el siguiente ejemplo:Campo de respaldo de propiedades: ¿para qué sirve?

private int m_Capacity; 

    public int Capacity 
    { 
     get { return m_Capacity > 0 ? m_Capacity : -666; } 
     set { m_Capacity = value; } 
    } 

Por otra parte, ¿qué beneficio puedo obtener de utilizar el ejemplo anterior sobre descartando el campo y utilizando sólo la propiedad a todos los efectos, como en el siguiente ejemplo:

public int Capacity 
    { 
     get { return Capacity > 0 ? Capacity : -666; } 
     set { Capacity = value; } 
    } 

lo que es bueno acerca del uso de un campo de respaldo para las características regulares (implementados la no-auto)?

+6

¿No cree que su segundo ejemplo da como resultado StackOverflowExceptions? ¿Lo has escrito correctamente? En este momento está haciendo referencia a la propiedad desde dentro de la propiedad. –

+1

Estás en lo correcto. No pensé en esto ni tampoco ejecuté el código. – galbarm

+2

@Alex Humphrey: .. dentro de la propiedad misma dentro de la propiedad misma dentro de la propiedad en sí ... – maxwellb

Respuesta

21

Si hace esto:

public int Capacity 
{ 
    get { return Capacity > 0 ? Capacity : -666; } 
    set { Capacity = value; } 
} 

entonces su código tendrá una recursión infinita. Nunca funcionará. Eso es porque el captador de Capacidad se está haciendo referencia a sí mismo. Lo mismo ocurre con el colocador.

A menos que utilice las propiedades automáticas, necesita un campo respaldo

+1

Es una pena que los campos de respaldo no pueden ser automáticos; que sería increíble. –

2

Principalmente porque obtendrá un StackOverflow.

+0

Indeed. Esto, específicamente, causa la mayoría de las SO que recuerdo haber visto recientemente en el código .Net. Me pregunto si una advertencia de compilación sería apropiada; ¿este uso alguna vez tiene sentido? –

+0

¿Es Resharper el que pone un pequeño símbolo en el margen izquierdo cuando una llamada es recursiva? Siempre lo veo, pero nunca estoy seguro de si cosas así son R # o VS. –

+0

Probablemente Resharper; Nunca he visto algo así en una acción VS. – cHao

3

El memberId privada explícito es útil si alguna vez necesita para acceder al valor real de m_Capacity, en lugar del valor 'gestionado' que recibe de la Capacidad propiedad,

EDIT: las otras publicaciones señalan correctamente el error de sintaxis. Debería haberlo mencionado también, pero lo ignoré y simplemente intenté responder a su pregunta, que parecía ser acerca de las propiedades automáticas

+0

O si necesita cambiar la forma en que se calcula la capacidad. Las propiedades con variables privadas de respaldo son una manera muy fácil de desacoplar. –

+0

Esto debería ser votado la respuesta. La respuesta aceptada actualmente solo indica que usted necesita una propiedad pero no * por qué * es necesaria, lo que respondería a la pregunta de OP. –

2

No olvide que las propiedades son simplemente sintaxis abreviada para generar métodos getter y setter. Se ven como campos, pero no lo son.

+0

también llamado "azúcar sintáctica". –

1

Los campos de respaldo admiten el concepto de encapsulado.

La encapsulación le permite cambiar posteriormente los detalles de implementación de la clase sin cambiar su interfaz.

Esto significa que tener un campo de respaldo con getters y setters en lugar de tener un miembro de clase pública hará que su código sea más robusto y/o legible para futuros desarrolladores o para su yo futuro.