2013-04-17 15 views
6

È possibile utilizzare l'attributo CallerMemberName per evitare di specificare il nome del membro come argomento String per il metodo chiamato quando si implementa l'interfaccia INotifyPropertyChanged.Does CallerMemberNameAttribute usa reflection

La domanda è: usa la riflessione dietro la scena? Ci sono delle prestazioni colpite da un hard coding Nome della proprietà?

+1

Quali sono stati i tuoi risultati quando hai testato il potenziale impatto sul rendimento? –

risposta

16

No; il compilatore codifica direttamente il nome membro direttamente durante la compilazione. In termini di IL, questo è ldstr. Per esempio, se si compila:

static void Implicit() 
{ 
    Log(); 
} 
static void Explicit() 
{ 
    Log("Explicit"); 
} 
static void Log([CallerMemberNameAttribute] string name = null) 
{} 

otteniamo:

.method private hidebysig static void Implicit() cil managed 
{ 
    .maxstack 8 
    L_0000: ldstr "Implicit" 
    L_0005: call void Program::Log(string) 
    L_000a: ret 
} 
.method private hidebysig static void Explicit() cil managed 
{ 
    .maxstack 8 
    L_0000: ldstr "Explicit" 
    L_0005: call void Program::Log(string) 
    L_000a: ret 
} 

Come si può vedere - l'IL è il nome cotto in diretta esattamente lo stesso come se mettiamo una stringa in manualmente.

1

Ho provato a decompilarlo e non c'è niente. Quindi non sembra che l'attributo stesso usi il riflesso. D'altra parte è posizionato in System.Runtime.CompilerServices che suggerisce che l'attributo stesso è gestito dal compilatore in un modo speciale quindi non ci dovrebbe essere alcuna penalità di prestazioni.