2013-04-17 65 views
6

可以使用CallerMemberName屬性來避免在實現INotifyPropertyChanged接口時將成員名稱指定爲調用方法的字符串參數。CallerMemberNameAttribute是否使用反射

問題是它是否使用場景背後的反射?硬編碼屬性名稱是否有任何性能損失?

+1

當你測試潛在的性能影響時,你的結果是什麼? –

回答

16

否;編譯器會在編譯期間直接對成員名稱進行硬編碼。就IL而言,這是ldstr。例如,如果我們編譯:

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

我們得到:

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

正如你所看到的 - 在IL有名字出爐直接正是因爲如果我們把一個字符串在同一手動。

1

我試過反編譯它,因爲它沒有看到屬性本身使用了反射。另一方面,它被放置在System.Runtime.CompilerServices中,表明屬性本身由編譯器以某種特殊方式處理,所以不應該有任何性能損失。