12

在实现 INotifyPropertyChanged 接口时,您可以使用CallerMemberName属性来避免将成员名称指定为被调用方法的 String 参数。

问题是它在幕后使用反射吗?硬编码属性名称是否会对性能造成影响?

4

2 回答 2

23

不; 编译器在编译期间直接对成员名称进行硬编码。就 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 的名称直接与我们手动输入字符串完全相同。

于 2013-04-17T06:40:21.930 回答
1

我试过反编译它,里面什么都没有。所以它看起来不像属性本身使用反射。另一方面,它的放置System.Runtime.CompilerServices表明属性本身由编译器以某种特殊方式处理,因此不应该有任何性能损失。

于 2013-04-17T06:34:46.057 回答