2008-09-14 13 views
78

En el pasado hemos declarado propiedades como esta:¿Cómo puedo acceder a la variable de respaldo de una propiedad implementada automáticamente?

public class MyClass 
{ 
    private int _age; 

    public int Age 
    { 
      get{ return _age; } 
      set{ _age = value; } 
    } 
} 

Ahora podemos hacer:

public class MyClass 
{ 
    public int Age {get; set;} 
} 

Mi pregunta es, ¿cómo puedo acceder a la variable privada que se crea automáticamente usando esta notación?

Preferiría acceder a la variable privada y no al acceso público 'Edad'. ¿Hay una notación predeterminada para acceder a la variable privada, o simplemente no es posible?

+10

¿Cuál es la diferencia en este caso de acceso al acceso privado frente al acceso público? Creo que es una buena práctica acceder al acceso público incluso desde la lógica en la clase declarante. Si alguna vez agrega algo de lógica al programa de acceso, no quiere tener que cambiar todo su código. –

+0

@ spoon16 ¿Puede darme un ejemplo de agregar lógica al programa de acceso y tener que cambiar todo su código como resultado? Realmente no entendí esta parte. – Ogen

Respuesta

2

No se puede, es una función de idioma en lugar de una función IDE. Para ser sincero, prefiero que IDE agregue la variable privada para ti. Estoy de acuerdo en que es un poco raro que la clase tenga que usar internamente el punto de entrada público para acceder a sus propias variables. Por lo tanto, yo no uso mucho esta nueva característica.

10

Detrás de las escenas de lo que sucede es la inyección de una variable miembro privada, con el prefijo <> k__AutomaticallyGeneratedPropertyField #

De C# 3.0 Automatic Properties explained

Aunque puede ser posible usar ese miembro privada directa, es muy hacky e innecesario.

12

Esta sintaxis es comúnmente llamada "azúcar de sintaxis", lo que significa que el compilador toma esa sintaxis y la traduce en algo más. En su ejemplo, el compilador generar código que se ve algo como esto:

[CompilerGenerated] 
private int <Age>k_BackingField; 

public int Age 
{ 
    [CompilerGenerated] 
    get 
    { 
     return this.<Age>k_BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     this.<Age>k_BackingField = value; 
    } 

Aun sabiendo todo eso, usted podría probablemente el acceso al campo de respaldo directamente, pero ese tipo de derrotas el propósito de utilizar las propiedades automáticas. Probablemente lo diga aquí porque luego depende de un detalle de implementación que podría cambiar en cualquier momento en una versión futura del compilador de C#.

23

El uso de propiedades automáticas implica que no necesita ninguna lógica de obtención/configuración para la propiedad, por lo que no es necesaria una variable de respaldo privada.

No utilice las propiedades automáticas si tiene alguna lógica compleja en su clase. Simplemente vaya a private int _age y getters/setters normales como lo haría normalmente.

OMI, propiedades automáticas son más adecuados para implementar rápidamente los objetos de usar y tirar o cápsulas de datos temporales como:

public class TempMessage { 
    public int FromID { get; set; } 
    public int ToID { get; set; } 
    public string Message { get; set; } 
} 

Cuando no se necesita mucha lógica.

+0

¿Por qué agregar lógica compleja a su clase afecta si usted usó propiedades automáticas dentro de esa clase? –

+0

Más de consistencia ... si tiene una lógica compleja, entonces querrá acceder a ella desde la variable de respaldo privada según las prácticas de OO ... y si usa propiedades automáticas, entonces ... habrá incoherencias para acceder a ellas propiedades. ya que algunos tendrán un prefijo de subrayado y otros no. – chakrit

92

El objetivo de las nuevas propiedades automáticas es reducir la cantidad de código repetitivo que necesita para escribir cuando solo tiene una propiedad simple que no necesita ninguna lógica especial en el conjunto o en el conjunto.

Si desea acceder al miembro privado que estas propiedades de uso, que suele ser por varias razones:

  • Necesitas algo más que un simple get/set - en este caso, sólo debe evitar usando propiedades automáticas para este miembro.
  • Desea evitar el golpe de rendimiento de pasar por la obtención o el ajuste y simplemente usar el miembro directamente; en este caso, me sorprendería si realmente hubiera un golpe de rendimiento. Los miembros simples get/set son muy fáciles de alinear, y en mi prueba (ciertamente limitada) no he encontrado una diferencia entre usar las propiedades automáticas y acceder al miembro directamente.
  • Solo desea tener acceso de lectura público (es decir, solo 'obtener') y la clase escribe directamente al miembro; en este caso, puede usar un conjunto privado en su propiedad automática. es decir

    public class MyClass 
    { 
        public int Age {get; private set;} 
    }

Esto generalmente cubre la mayoría de las razones para querer obtener directamente al campo respaldo utilizado por las propiedades automáticas.

+0

Es cierto: reducen el código de la placa de la rueda y también les advierto que reducen lo que necesita probar. Algunos podrían argumentar que es necesario probar el get/set manual pero no con las propiedades automáticas ya que puede confiar en el framework. –

+3

El ejemplo de código es incorrecto aquí. Debe ser clase pública MyClass { public int Age {get; conjunto privado;} } Estoy de acuerdo con esta respuesta. No puede acceder al campo privado y, si es necesario, no debe usar Propiedades automáticas en primer lugar. – hwiechers

+0

hwiechers, gracias por eso, tuve esa edición, pero cuando trato de arreglar el formateo, debo haber pegado de nuevo y borré el bloque de código incorrecto. Doh! – Wilka

7

No debería, y es muy poco probable que lo necesite. Si necesita acceder a la propiedad, solo use la propiedad pública (por ejemplo, this.Age). No hay nada especial en el campo privado que respalda la propiedad pública, usarlo de preferencia a la propiedad es simplemente una superstición.

+1

Siempre me pregunté cuál era el punto de las propiedades automáticas. Si no tienes una lógica especial en tus getters y setters, ¿por qué tenerlos? –

+4

@MatthewLock flexibilidad. Con el acceso directo al campo, está bloqueado en ese diseño a menos que cambie todo el código del cliente al mismo tiempo. Pero con una propiedad si decide cambiarla de un "pseudo-campo" a una propiedad calculada, o si decide agregar afirmaciones y verificaciones sobre el colocador, o lo que-tenga-usted, puede hacerlo de manera transparente. Esto es aún más útil si está escribiendo código de biblioteca, donde no puede controlar todo el código del cliente. – Wedge

Cuestiones relacionadas