2012-03-10 10 views
11

Sé que cuando se usan propiedades automáticas, el compilador crea su propio campo de respaldo detrás de la pantalla. Sin embargo, en muchos programas que leo para aprender de, veo a la gente escribir explícitamentePropiedades automáticas con o sin campo de respaldo: ¿preferencia?

private int _backingField; 

public int Property { get { return _backingField; } } 

¿Cuál es la diferencia entre arriba y abajo?

public int Property { get; private set; } 

entiendo que es obvio para utilizar la propiedad cuando en realidad tienen efectos secundarios en el getter o setter, pero eso no es a menudo el caso. Además, entiendo que debe usar explícitamente el campo de respaldo en el caso de las estructuras, no puede acceder a sus miembros a través de las propiedades.

La única diferencia que he podido encontrar es que la forma de llamar al valor es diferente dentro de la clase en la que está definido. ¿Es simple preferencia, o hay algo más para llamar un valor a través de su propiedad o al acceder directamente al campo? ¿Convenciones simples?

Respuesta

14

No hay mucha diferencia entre esos dos fragmentos; por ejemplo, no se puede pasar una propiedad por referencia, pero eso rara vez es un problema. Sin embargo, si desea que el campo sea de sólo lectura, como esto:

private readonly int _backingField;  
public int Property { get { return _backingField; } } 

entonces hay una diferencia. El código que he escrito arriba impide que el valor se modifique en otro lugar dentro de la clase, dejando en claro que esto realmente debe ser inmutable. Me gustaría poder declarar un campo de solo lectura con una propiedad de implementación de solo lectura automáticamente, configurable solo dentro del constructor, pero eso no está disponible en este momento.

Esto es bastante confuso, por cierto:

Además, entiendo que usted tiene que utilizar explícitamente el campo de respaldo en el caso de estructuras, no se puede acceder a sus miembros a través de propiedades.

¿Qué quieres decir? Definitivamente puede usar propiedades dentro de las estructuras. ¿Estás hablando de copias de los campos, que son estructuras mutables, es decir, la diferencia entre:

foo.someField.X = 10; 

y

foo.SomeProperty.X = 10; 

? Si es así, normalmente evito que sea un problema al hacer que mis estructuras sean inmutables para comenzar :)

+1

Usando el Vector2 del XNA como ejemplo, si digo public Vector2 TheVector {get; conjunto; } No puedo llamar al TheVector.X = 10; En su lugar, debo usar el campo real. Algo sobre pasar por valor/referencia. (¿Tiene algún material de lectura que aclara pasar por valor/referencia para C#, como nota al margen?) – Taelia

+0

Además, si realmente no hay diferencia entre mis dos ejemplos, ¿por qué tanta gente todavía crea explícitamente un campo de respaldo (sin real propósito)? – Taelia

+0

@Taelia: Correcto, ese es el caso de una estructura mutable, que normalmente evito. Es porque la propiedad devuelve una copia del valor. Y no voy a tratar de dar razones de lo que otras personas hacen. –

Cuestiones relacionadas