2012-02-13 17 views
11

Non esiste un riferimento (esplicito) a una variabile privata firstName che si suppone nasconda da FirstName. Potresti spiegare come funziona? Suppongo che ci sia qualche variabile privata che viene generata e impostata. Grazie.Dove/qual è la variabile privata nella proprietà auto-implementata?

// auto-implemented property FirstName 
public string FirstName { get; set; } 
+0

Questo è un duplicato. Vedi i link correlati sul lato. – leppie

+0

possibile duplicato di [C# 3.0: Proprietà automatiche - quale sarebbe il nome della variabile privata creata dal compilatore] (http://stackoverflow.com/questions/1277018/c-sharp-3-0-automatic-properties-what- sarebbe-il-nome-della-variabile-privata-c) – nawfal

risposta

25

Fondamentalmente il compilatore converte il codice in qualcosa di simile a questo:

private string <__>firstName; 

public string FirstName 
{ 
    get { return <__>firstName; } 
    set { <__>firstName = value; } 
} 

Questo è improbabile che sia il nome esatto, ma l'uso di parentesi angolari nel nome è importante - perché lo rende un nome indicibile . (Questa è una terminologia non ufficiale, ma ampiamente usata - non so se Eric Lippert in realtà l'abbia coniato, o se fosse la prima persona ad usarlo in qualcosa che ho letto.) È un nome che non è un identificatore C# valido, ma di cui il CLR è abbastanza soddisfatto. Questo ha due vantaggi:

  • Il compilatore non ha bisogno di preoccuparsi di conflitti di denominazione con tuoi identificatori
  • Il compilatore non ha bisogno di preoccuparsi se si sta cercando di fare riferimento al campo in il tuo codice personale - non puoi, perché il nome è indicibile!

Utilizza la stessa tecnica per tutti i tipi di altro codice generato - tipi anonimi, funzioni anonime, blocchi iteratore ecc

+7

Penso di aver imparato quell'argot da Anders; Non so da dove l'abbia preso. –

8

sì, the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors. (c) msdn

EDIT:
Quando si definisce una proprietà, compilatore emetterà 2 metodi: get_XXX e set_XXX. Quando il compilatore C# vede il codice che sta cercando di ottenere o impostare una proprietà, il compilatore emette effettivamente una chiamata a uno di questi metodi. (c) "CLR via C#"

2

Gli altri ragazzi hanno risposto a questa, ma un po 'più info ... si può trovare il campo supporto in fase di esecuzione utilizzando la riflessione. Cerca i campi con un nome come < < PropertyName >> k__BackingField.

un altro post che può aiutare:

Problemi correlati