2012-02-13 9 views
11

No hay referencia (explícita) a una variable privada firstName que se supone que FirstName está ocultando. ¿Podrías explicar cómo funciona esto? Supongo que hay alguna variable privada que se está obteniendo y configurando. Gracias.¿Dónde/cuál es la variable privada en la propiedad implementada automáticamente?

// auto-implemented property FirstName 
public string FirstName { get; set; } 
+0

Este es un duplicado. Ver enlaces relacionados en el lateral. – leppie

+0

posible duplicado de [C# 3.0: Propiedades automáticas: cuál sería el nombre de la variable privada creada por el compilador] (http://stackoverflow.com/questions/1277018/c-sharp-3-0-automatic-properties-what- ser-el-nombre-de-variable-privada-c) – nawfal

Respuesta

25

Básicamente, el compilador convierte el código en algo como esto:

private string <__>firstName; 

public string FirstName 
{ 
    get { return <__>firstName; } 
    set { <__>firstName = value; } 
} 

Eso es poco probable que sea el nombre exacto, pero el uso de corchetes angulares en el nombre es importante, porque lo convierte en un nombre indecible . (Esa es una terminología no oficial, pero ampliamente utilizada; no sé si Eric Lippert realmente la inventó, o si fue la primera persona en usarla en algo que leí). Es un nombre que no es un identificador de C# válido, pero con lo que el CLR está bastante satisfecho. Esto tiene dos ventajas:

  • El compilador no tiene que preocuparse por las colisiones de nombres con sus identificadores
  • El compilador no tiene que preocuparse acerca de si usted está tratando de hacer referencia al campo de tu propio código, no puedes, ¡porque el nombre es indescriptible!

Se utiliza la misma técnica para todo tipo de otros códigos generados - tipos anónimos, funciones anónimas, bloques de iterador etc.

+7

Creo que aprendí ese argot de Anders; No sé de dónde lo sacó. –

8

sí, the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors. (c) msdn

EDIT:
Cuando se define una propiedad, compilador emitirá 2 métodos: get_XXX y set_XXX. Cuando el compilador de C# ve el código que intenta obtener o establecer una propiedad, el compilador realmente emite una llamada a uno de estos métodos. (c) "CLR a través de C#"

2

Los otros chicos han respondido a esta, pero un poco más información ... se puede encontrar el campo respaldo en tiempo de ejecución utilizando la reflexión. Busque campos con nombres como < < PropertyName >> k__BackingField.

Otro post que puede ayudar:

Cuestiones relacionadas