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.
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. –
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