2013-04-17 6 views
6

Sie können das Attribut CallerMemberName verwenden, um zu vermeiden, dass Sie den Membernamen als String-Argument für die aufgerufene Methode angeben, wenn Sie die INotifyPropertyChanged-Schnittstelle implementieren.Verwendet CallerMemberNameAttribute reflection

Die Frage ist, ist das Spiegelbild hinter der Szene zu benutzen? Gibt es irgendwelche Leistungseinbußen über hart codierenden Eigenschaftsnamen?

+1

Was waren Ihre Ergebnisse, als Sie den potenziellen Leistungseinbruch getestet haben? –

Antwort

16

Nein; Der Compiler programmiert den Membernamen direkt während der Kompilierung. In Bezug auf die IL ist dies ldstr. wenn wir zum Beispiel kompilieren:

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

erhalten wir:

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

Wie Sie sehen können - die IL der Name in direkt genau das gleiche wie wenn wir einen String gebacken setzen in manuell.

1

Ich habe versucht, es zu dekompilieren und es gibt nichts. So sieht es nicht aus wie das Attribut selbst Reflexion verwendet. Auf der anderen Seite ist es in System.Runtime.CompilerServices platziert, was darauf hindeutet, dass das Attribut selbst vom Compiler in einer speziellen Weise behandelt wird, so dass es keine Leistungseinbußen geben sollte.