2009-08-14 8 views
7

Stavo controllando le nuove funzionalità di .NET 3.5 e ha scoperto che in C# 3.0, possiamo usareC# 3.0: Proprietà automatici - quale sarebbe il nome della variabile privata creata da compilatore

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

invece di

private string name; 

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

Se utilizzo le Proprietà automatiche, quale sarà il nome della variabile privata per Nome? le esercitazioni su internet dicono che il compilatore creerà automaticamente una variabile privata. Come posso usare/accedere alla variabile privata, se voglio usarla in un metodo in questa classe?

+2

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

+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

risposta

17

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.

+0

Desidero utilizzare il valore della proprietà in un metodo che esegue alcuni calcoli matematici – Shyju

+0

Quindi perché non utilizzare solo la proprietà stessa? –

+0

L'unica cosa che ottiene è restituire quel valore specifico;). – Dykam

1

Se si utilizzano le proprietà automatiche, non è possibile accedere al campo privato. Non è solo privato, è anche anonimo.

+0

A destra. Se per qualsiasi motivo pensi di aver bisogno di accedere al membro privato (altri che vogliono sapere come si chiama "per curiosità"), allora non implementare la proprietà in questo modo, ma definisci il tuo membro privato. Come "ai vecchi tempi". ;-) – peSHIr

4

Come già detto: non è possibile accedere alla variabile generata automaticamente (senza utilizzare trucchi errati). Ma suppongo che tu stia facendo quella domanda perché vuoi avere solo un getter, ma vuoi comunque usare le proprietà automatiche ... giusto? In questo caso è possibile utilizzare questo:

public string FirstName { get; private set; } 

Ora avete un setter privata e un getter pubblico.

0

Quindi, come posso utilizzare/accedere alla variabile privata, se voglio usarlo in un metodo in questa classe?

Nel codice sorgente solo bisogno di, e sono ammessi solo a lavorare con la Proprietà Accessor person.LastName o LastName se si sta scrivendo il codice all'interno della classe person.

Il compilatore creerà automaticamente una variabile membro privata o un campo di supporto, ma questo esiste nel codice CIL. Non esiste da nessuna parte nel codice sorgente.

+0

@Shyju: Penso che potresti fare l'ipotesi sbagliata che Visual Studio genererà automaticamente un campo privato che puoi utilizzare. L'auto-generazione viene eseguita dal compilatore ed esiste solo nel codice CIL. –

+0

Se davvero VERAMENTE devi ottenere il campo privato, allora puoi usare la riflessione. Ma sono abbastanza sicuro che questo non è quello che vuoi, –

Problemi correlati