2008-11-07 25 views
22

Si tiene una propiedad que obtiene y establece una variable de instancia, normalmente siempre usa la propiedad desde fuera de esa clase para acceder a ella.¿Debería acceder a una variable dentro de la misma clase a través de una propiedad?

Mi pregunta es, ¿siempre deberías hacerlo siempre dentro de la clase? Siempre he usado la propiedad si hay una, incluso dentro de la clase, pero me gustaría escuchar algunos argumentos a favor y en contra sobre cuál es la más correcta y por qué.

¿O solo se trata de estándares de codificación utilizados en el proyecto?

Respuesta

22

Uno de los argumentos más sólidos para acceder a las variables locales (alcance de clase) a través de las propiedades es que agrega un nivel de abstracción en su clase. Si cambia cualquier lógica con respecto a cómo se almacena ese campo, el resto de su código no se verá afectado.

Por ejemplo, puede cambiar eso de una variable local a una propiedad de un objeto secundario, a una llamada a la base de datos, a una llamada al servicio web, a una propiedad estática en una clase, etc. Al realizar el cambio, le proporciona un único punto de cambio, la propiedad, y no tiene que actualizar el resto de su clase, ya que todos usan la propiedad.

También el uso de la propiedad le permite aplicar reglas comerciales sobre el valor de la propiedad en lugar de tener que aplicar la misma regla en cada ubicación donde accedería directamente al campo. Una vez más, la encapsulación

Con la introducción de propiedades automáticas incluso hay menos razones para tener explícitamente una variable local, a menos que se necesita aplicar reglas de negocio en el get/set

+2

En ese sentido, me encantaría tener la sintaxis del lenguaje para evitar el acceso directo al campo de respaldo, incluso cuando no se pueden usar las propiedades automáticas por algún motivo. – Alan

+0

+1 con el advenimiento de propiedades automáticas –

9

Depende de si desea aplicar cualquier lógica implementada en el conjunto de propiedades, por lo que realmente debe decidir caso por caso.

Cuando vaya directamente al campo privado, sabrá que el campo está configurado exactamente para lo que dice.

Cuando revisa la propiedad, el valor se establece de acuerdo con la lógica del colocador, por lo que obtiene las reglas comerciales o la validación que desee sobre los valores asignados a ese campo.

Bastante difícil encontrar una regla sobre cuándo hacer cualquiera de las dos es "correcto", sobre la única que diría que sigo es que en la inicialización del constructor casi nunca usaría la propiedad.

+0

Buen punto. Use el campo si desea omitir la lógica en la propiedad. – Brannon

0

Creo que es pura preferencia.

Aunque, me encuentro con las propiedades mucho más en C# 3.0, con el apoyo de auto-propiedad:

class Foo { 
    public string Value { get; set; } 

    public void Write() { 
     Console.Write(Value); 
    } 
} 
+0

Las propiedades automáticas son una arruga interesante: me encantan porque estabilizan la interfaz, pero no podían adivinar cómo influyen en el uso de propiedades internas de una clase. ¿Hacen que sea más o menos probable que me pierda la lógica del setter que podría estropear las cosas, o es lo mismo? –

+0

Por definición, las propiedades automáticas no tienen lógica de setter, por lo que son funcionalmente equivalentes a una variable miembro. La diferencia es que más tarde puede cambiar la implementación e introducir la lógica del setter si es necesario. –

+0

Sí, lo sé, lo que me pregunto es si las propiedades automáticas (y siempre usándolas) significan que cuando se implementa la lógica del instalador, es más probable que se pase por alto y cause problemas. No es un problema técnico, solo una pregunta de "¿Qué podría hacer que cometa un error tonto?" –

0

dependiendo general en el proyecto las normas de codificación que utilizo un "_" o "m" que precede el nombre de mis atributos privados de clase. (Al igual que a continuación)

private int mVariable; 
private int _Variable; 

con los de delante de la variable reconozco de inmediato que estoy tratando con una variable interna para la clase. Luego, cuando se trata de depurar más tarde yo mismo o alguien más puede reconocer de inmediato que el código está tratando con una variable privada interna y hacer un ajuste. Entonces todo se reduce a la legibilidad para mí.

+0

_ los hace no compatibles con CLS Creo que – TheCodeJunkie

+0

@Selfinflicted CLS compliance solo se aplica a campos/métodos/ect públicamente visibles. Incluso si se aplica la conformidad CLS, los nombres de campo internos se eliminan cuando se construye en modo Release de todos modos, por lo que ninguna razón que importaría. –

0

Sí creo que usted debe utilizar las propiedades internamente en su clases siempre que sea posible.Las propiedades son más flexibles y le permite agregar lógica para validar su valor en un lugar central.

También puede retrasar la inicialización del campo a cada vez que se usa la propiedad en lugar de forzarse a hacerlo en el constructor (o en cualquier lugar donde se use el campo). Ejemplo:

class Test { 
    private int _checksum = -1; 
    private int Checksum { 
     get { 
     if (_checksum == -1) 
      _checksum = calculateChecksum(); 
     return checksum; 
     } 
    } 
} 
0

Usar siempre Propiedades, Estas son algunas de las razones

  1. fácil de usar. En Visual Studio puede usar la "Pestaña Pestaña Prop". Obtendrá el fragmento de la propiedad
  2. Las propiedades son elementos del lenguaje que se accede como si fueran miembros de datos
  3. clases de .NET Framework utiliza la misma, las clases de código de enlace en las propiedades de soporte de datos de .NET Framework,
  4. Las propiedades tienen todas las características del lenguaje de los métodos. Las propiedades pueden ser virtuales
+0

Creo que no entendió la pregunta. –

Cuestiones relacionadas