你可以使用CallerMemberName特性,实现INotifyPropertyChanged接口时,避免将成员名称作为String参数指定给被调用方法。
问题是它在幕后是否使用了反射?与硬编码属性名称相比,是否会有性能损失?
问题是它在幕后是否使用了反射?与硬编码属性名称相比,是否会有性能损失?
不会,编译器在编译期间直接硬编码成员名称。就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
中,这表明编译器以某种特殊的方式处理该属性,因此不应该有任何性能损失。