2009-08-13 10 views
13

Siempre que haya dudas sobre la credibilidad de Properties, veo que la mayor parte de la discusión tiene lugar en funciones/métodos frente a propiedades. Pero también me gustaría saber el convincente razón para usar la propiedad con el campo privada asociada vs ámbito público directamente en sí, en caso de comportamientos get/set más comunes con los tratamientos siguientes, me refiero a esta formaPropiedad (sin procesamiento adicional) vs campo público

public string CustomerName; 

vs

private string customerName; 
public string CustomerName 
{ 
get{return customerName;} 
set(string value){this.customerName=value;} 
} 
+5

También puede hacer "public string CustomerName {get; set;}" – cyberconte

Respuesta

22

usted obtiene fuente/compatibilidad binaria si más adelante necesita añadir otro comportamiento, se llega a añadir puntos de ruptura, y es simplemente filosóficamente más limpia (atención sobre el comportamiento, no el mecanismo de almacenamiento).

Tenga en cuenta que no es necesario el conjunto del último bloque en C# 3:

public string CustomerName { get; set; } 

Ver my article on "Why Properties Matter" para más información.

+0

Jon ... Entiendo su punto. Pero de alguna manera sentí que el código sería más limpio de otra manera, es decir, si hay más campos en la clase (digamos 30+), entonces la cantidad de líneas de código sería al menos 4 veces mayor con las propiedades. ¡Ahora las propiedades automáticas en C# 3 y en VB 10 nos hacen felices a todos! – Raj

+7

Si tiene 30 campos en su clase, probablemente deba usar más encapsulación para comenzar. –

+1

Solo para confirmar si entendí bien sobre la encapsulación, agrupando subconjuntos lógicos de los campos grandes en una sola clase en diferentes clases/interfaces y obtengo estos a través de la herencia o la composición. ¿Es eso correcto? Si es así, eso aún contendría una carga adicional de código distribuido en diferentes clases en lugar de en una clase. Lo siento si te estoy molestando con tonterías. Todo esto se debe a mi frustración por mantener miles de líneas de código (con muchas propiedades sin lógica adicional) escritas por otra persona. – Raj

3
  1. Puede anular o al menos crear una "nueva" propiedad en una clase derivada

  2. En este punto, la gente espera que las propiedades sean expuestos y los campos que se oculta. Si alguien va a reflexionar sobre su clase (cada vez es más común con herramientas como Castle Windsor, NHibernate), hay un mundo de diferencia, es probable que no estén buscando campos expuestos.

1

También puede proporcionar una validación básica con propiedades. Por ejemplo, para prevenir el establecimiento de una propiedad a un estado no válido como un valor negativo para una altura:

private int height; 
public int Height 
{ 
    get{ return height; } 
    set 
    { 
    if (value > 0) 
    { 
     height = value; 
    } 
    } 
} 
+1

Estoy de acuerdo en que cualquier procesamiento adicional como la validación hace que sea obvio usar propiedades. Es por eso que he mencionado específicamente el caso de tal procesamiento adicional. – Raj

2

Esto es sobre todo un error en Java. En muchos otros lenguajes (Python, Delphi, Groovy), el compilador generará los getters y setters para usted a menos que proporcione el código.

Esto significa que puede usar un campo "público" en Groovy y el compilador generará silenciosamente e invocará al setter/setter. Si necesita hacer magia adicional cuando se cambia un campo, puede presentar un colocador especializado y todo funcionará.

Es una de esas cosas donde la realidad choca con un diseño. Los diseñadores de Java no querían que el compilador hiciera nada que no pueda ver. Lo que parecía una buena idea hace muchos años, no resultó demasiado bien.

+0

Nota: La pregunta originalmente carecía de una etiqueta de idioma, por lo que esta respuesta supone que el código en la pregunta es Java; la etiqueta [tag: C#] se agregó más tarde. – mklement0

2

Me di cuenta de un uso útil de la propiedad. Si va a vincular la colección de su objeto a un DataGrid o DataGridView u otro control enlazable, los únicos nombres evaluables reconocibles son los campos Propiedad y no los campos públicos.

Cuestiones relacionadas