CallerMemberNameAttribute使用反射技术吗?

14
你可以使用CallerMemberName特性,实现INotifyPropertyChanged接口时,避免将成员名称作为String参数指定给被调用方法。
问题是它在幕后是否使用了反射?与硬编码属性名称相比,是否会有性能损失?

1
当您测试潜在的性能影响时,您的结果如何? - Rune FS
2个回答

26

不会,编译器在编译期间直接硬编码成员名称。就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中,这表明编译器以某种特殊的方式处理该属性,因此不应该有任何性能损失。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接