2009-08-14 10 views
7

Estaba revisando las nuevas características de .NET 3.5 y encontró que en C# 3.0, podemos utilizarC# 3.0: Propiedades automáticas - lo que sería el nombre de la variable privada creada por el compilador

public class Person 
{  
public string FirstName { get; set; } 
public string LastName { get; set; } 
} 

en lugar de

private string name; 

public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 

Si uso las Propiedades automáticas, ¿cuál será el nombre de la variable privada para Nombre? los tutoriales en Internet dicen que el compilador creará automáticamente una variable privada. Entonces, ¿cómo puedo usar/acceder a la variable privada, si quiero usarla en un método de esta clase?

+2

Tenga en cuenta que esta es una característica de C# 3.0, no de .NET 3.5. Puede usarlo incluso si tiene como objetivo .NET 2.0 desde un compilador de C# 3.0. –

+0

posible duplicado de [¿Es la implementación de Propiedades automáticas en la especificación?] (Http://stackoverflow.com/questions/1171636/is-the-implementation-of-auto-properties-in-the-spec) – nawfal

Respuesta

17

reescrito para ser más clara

El campo se genera bien, pero no es visible para el código como un campo regular.

Aquí está su propiedad típica automática:

public string FirstName { get; set; } 

cual, si nos fijamos en el ensamblado compilado, produce este campo almacén de respaldo:

[CompilerGenerated] 
private string <FirstName>k__BackingField; 

Nota del < y> allí, que son no personajes que puede usar en sus propios nombres de campo. Tampoco puede acceder a ese campo, porque no "existe" en lo que respecta al compilador, cuando mira su código.

La verdadera pregunta aquí, de mí, es por qué desea acceder a ese campo. En otras palabras, ¿por qué necesita acceso al campo, y qué hace para su código que no tenga acceso a la propiedad?

Si desea evitar que fuera de acceso de escritura en el campo, eso es fácilmente factible, haciendo que el método setter privado, así:

public string FirstName { get; private set; } 

Tenga en cuenta que dado que el campo está realmente presente en la asamblea, se significa que esto no es JITter magic, sino magic compilador, y por lo tanto podría usar la reflexión para encontrar y acceder a ese campo.

Pero de nuevo, ¿por qué querrías?

Supongamos que realmente existe un motivo legítimo para querer usar el campo, en lugar de la propiedad.No puedo pensar en uno, aunque yo probablemente hacerlo de manera diferente, y eso sería que desea pasar el nombre del campo a un método como out o ref parámetro, así:

public void AdjustName(ref String name) 
{ 
    name = Capitalize(name); 
} 

No se puede pasar propiedades como fuera/ref parámetros, por lo que este código no funcionará:

AdjustName(ref string FirstName); 

En este caso, es necesario recurrir a la "vieja" de la definición de propiedades, añadiendo el campo almacén de respaldo manualmente, como este:

private string firstName; 
public string FirstName 
{ 
    get { return firstName; } 
    set { firstName = value; } 
} 

Con esto en su lugar, puede llamar a ese método:

AdjustName(ref string firstName); // note the field, not the property 

Sin embargo, probablemente cambiar ese método con el fin de devolver el nuevo valor, en lugar de ajustar directamente una variable referenciado.

+0

Quiero utilizar el valor de la propiedad en un método que hace algunos cálculos matemáticos – Shyju

+0

¿Por qué no usar la propiedad en sí? –

+0

Lo único que se consigue es devolver ese valor específico;). – Dykam

1

Si usa propiedades automáticas, entonces no puede acceder al campo privado. No es solo privado, también es anónimo.

+0

Derecha. Si por alguna razón cree que necesita acceso al miembro privado (otro que quiere saber cómo se llama "por curiosidad"), entonces no implemente la propiedad de esta manera, sino que defina su propio miembro privado. Como "en los viejos tiempos". ;-) – peSHIr

4

Como ya se dijo: No puede acceder a la variable generada automáticamente (sin utilizar trucos malos). Pero supongo que estás haciendo esa pregunta porque quieres tener solo un comprador, pero aún quieres usar propiedades automáticas ... ¿verdad? En ese caso, puede usar este:

public string FirstName { get; private set; } 

Ahora usted tiene un organismo privado y un comprador público.

0

Entonces, ¿cómo puedo usar/acceder a la variable privada, si quiero usarla en un método de esta clase?

En su código fuente que sólo se necesitan, y sólo se les permite trabajar con la propiedad de acceso person.LastName o LastName si está escribiendo código dentro de la clase de persona.

El compilador creará automáticamente una variable miembro privada, o campo de respaldo, pero esto existe en el código CIL. No existe en ningún lugar en su código fuente.

+0

@Shyju: Creo que podría estar asumiendo erróneamente que Visual Studio generará automáticamente un campo privado para que usted lo use. La autogeneración la realiza el compilador y solo existe en el código CIL. –

+0

Si realmente REALMENTE debe hacerse con el campo privado, entonces puede usar el reflejo. Pero estoy bastante seguro de que esto no es lo que quieres, –

Cuestiones relacionadas