riscritto per essere più chiaro
Il campo è generato bene, ma non è visibile per il codice come un campo regolare.
Ecco la tua struttura tipicamente automatica:
public string FirstName { get; set; }
che, se guardiamo l'assembly compilato, produce questo campo archivio di backup:
[CompilerGenerated]
private string <FirstName>k__BackingField;
Annotare il < e> in là, che sono non caratteri che puoi usare nei tuoi nomi di campo. Né puoi accedere a quel campo, perché non "esiste" per quanto riguarda il compilatore, quando guarda al tuo codice.
La vera domanda qui, da parte mia, è perché si vorrebbe accedere a quel campo. In altre parole, perché hai bisogno di accedere al campo e cosa fa per il tuo codice che non accede alla proprietà?
Se si desidera impedire al di fuori accesso in scrittura al campo, che è facilmente fattibile, rendendo il metodo setter privato, in questo modo:
public string FirstName { get; private set; }
Nota che, poiché il campo è in realtà presente nel montaggio, significa che questa non è magia JITter, ma magia del compilatore, e quindi puoi usare la riflessione per trovare e accedere a quel campo.
Ma ancora, perché vorresti?
Ora, supponiamo che ci sia davvero un motivo legittimo per cui si desidera utilizzare il campo, anziché la proprietà.Mi viene in mente uno, anche se mi sarebbe probabilmente farlo in modo diverso, e che sarebbe che si desidera passare il nome del campo a un metodo come out o ref parametro, in questo modo:
public void AdjustName(ref String name)
{
name = Capitalize(name);
}
Non è possibile passare proprietà come out/ref-parametri, quindi questo codice non funzionerà:
AdjustName(ref string FirstName);
In questo caso, è necessario ripiegare al "vecchio" modo di definire le proprietà, aggiungendo il campo archivio di backup manualmente, In questo modo:
private string firstName;
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
Con questo in luogo, è possibile chiamare quel metodo:
AdjustName(ref string firstName); // note the field, not the property
Tuttavia, probabilmente cambiare questo metodo al fine di restituire il nuovo valore, invece di regolare direttamente una variabile di riferimento.
Si noti che questa è una funzionalità di C# 3.0, non di .NET 3.5 - è possibile utilizzarla anche se si sta utilizzando .NET 2.0 da un compilatore C# 3.0. –
possibile duplicato di [L'implementazione di Proprietà auto nelle specifiche?] (Http://stackoverflow.com/questions/1171636/is-the-implementation-of-auto-properties-in-the-spec) – nawfal