可以使用CallerMemberName屬性來避免在實現INotifyPropertyChanged接口時將成員名稱指定爲調用方法的字符串參數。CallerMemberNameAttribute是否使用反射
問題是它是否使用場景背後的反射?硬編碼屬性名稱是否有任何性能損失?
可以使用CallerMemberName屬性來避免在實現INotifyPropertyChanged接口時將成員名稱指定爲調用方法的字符串參數。CallerMemberNameAttribute是否使用反射
問題是它是否使用場景背後的反射?硬編碼屬性名稱是否有任何性能損失?
否;編譯器會在編譯期間直接對成員名稱進行硬編碼。就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有名字出爐直接正是因爲如果我們把一個字符串在同一手動。
我試過反編譯它,因爲它沒有看到屬性本身使用了反射。另一方面,它被放置在System.Runtime.CompilerServices
中,表明屬性本身由編譯器以某種特殊方式處理,所以不應該有任何性能損失。
當你測試潛在的性能影響時,你的結果是什麼? –