2012-01-07 6 views
7

Eventuali duplicati:
Difference between Property and Field in C#C# campo vs. proprietà

ho pensato che le proprietà di base ({ get; set; }) in cui lo stesso come campi pubblici, con solo il vantaggio di essere in grado di cambiare loro senza rompere la compatibilità binaria. Seguendo la risposta che ho ottenuto qui https://stackoverflow.com/a/8735303/331785, ho scoperto che c'è anche uno svantaggio per le proprietà. Non è possibile accedervi per riferimento se sono di un tipo di valore. Perché è questo e quali altre differenze ci sono?

+0

qui avete la risposta: http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp –

+5

Questo è un errore. Le proprietà non sono accessibili per riferimento, punto e basta. Hai commesso l'errore comune di confondere il passaggio dei riferimenti con i tipi di riferimento. – Noldorin

+1

Vale a dire, il riferimento di un tipo di riferimento viene passato per valore per impostazione predefinita. Il passaggio per riferimento avviene sempre con la parola chiave 'ref' o' out', sia per i tipi di riferimento sia per quelli di valore. – diggingforfire

risposta

14

Ho scoperto che esiste anche uno svantaggio per le proprietà. Non è possibile accedervi per riferimento se sono di un tipo di valore. Perché è questo

Perché sotto le copertine, una proprietà è solo un metodo. Se guardi l'IL, vedrai metodi come get_PropertyName e set_PropertyName. Il problema con questo è di supportare il lavoro con i riferimenti, dovresti essere in grado di restituire un riferimento per un metodo.

public ref T MyProperty 
{ 
    get 
    { 
     return ref _underlyingField; 
    } 
} 

Questo ovviamente è something entirely possible in the CLR; ma non esposto dal linguaggio C#.

Sebbene sia possibile, il CLR ha bisogno di alcune modifiche per mantenerlo come verificabile. La sintassi per la proprietà dovrebbe supportarla.

Tuttavia, è uno di quello utile? Come hai affermato, un campo può farlo. Se ne hai bisogno; usa un campo. Sostenerlo richiederebbe molto lavoro. Ci sono probabilmente pochissimi casi in cui è appropriato; e creerebbe molti casi in cui il solo utilizzo di un campo avrebbe potuto essere migliore in primo luogo.

4

Le proprietà sono solo sintassi di rivestimento di zucchero per un metodo getX() e setX(). Sembra e si comporta come un campo, ma in realtà sono solo due metodi. Il motivo per cui è stata aggiunta la proprietà automatica è stato evitare la ripetizione di dover creare un campo e creare un getter e setter standard per la proprietà e rendere molto più semplice consentire la modifica dell'implementazione senza modificare l'interfaccia.

Il motivo per cui non è possibile accedere per riferimento se si tratta di un tipo di valore è perché i tipi di valore sono generalmente nello stack e perché si sta chiamando un metodo. Il getter della proprietà deve essere chiamato e il valore restituito deve essere inserito nello stack prima che possa essere referenziato.

+6

-1 per propagare il mito dei tipi di valore in pila (anche con "generalmente"). Se la proprietà (o campo) è di una classe, * non sarà * in pila. –

+0

@JonSkeet Penso che stia parlando del valore di ritorno del getter, che prima si troverà in un registro, e quindi probabilmente nello stack in modo da ottenere un indirizzo che può essere referenziato. – CodesInChaos