CallerMemberNameAttribute是否使用反射?



在实现INotifyPropertyChanged接口时,可以使用CallerMemberName属性来避免将成员名指定为被调用方法的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中,这表明属性本身是由编译器以某种特殊的方式处理的,所以不应该有任何性能损失。

相关内容

  • 没有找到相关文章

最新更新