c# 6.0的nameof()结果是否被存储?

本文关键字:是否 结果是 存储 结果 nameof | 更新日期: 2023-09-27 18:07:42

从我可以读取编译器只是发出一个字符串,没有其他真正发生?

有什么原因导致这个电话的结果不能被保留吗?对于一个nameof(MyClass)来说,如果这种情况经常发生,理论上它可能是值得的?

c# 6.0的nameof()结果是否被存储?

是的,它将像任何其他字符串字面值一样被存储。

这可以通过下面的TryRoslyn示例来演示:

public void M() 
{
    Console.WriteLine(nameof(M));
}

被编译成这个IL:

.method public hidebysig 
    instance void M () cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 11 (0xb)
    .maxstack 8
    IL_0000: ldstr "M"
    IL_0005: call void [mscorlib]System.Console::WriteLine(string)
    IL_000a: ret
} // end of method C::M

您可以看到"M"正在使用ldstr加载,这意味着它被internned:

"公共语言基础结构(CLI)保证引用具有相同字符序列的两个元数据标记的两个ldstr指令的结果返回完全相同的字符串对象(这个过程称为"字符串实习")。"

操作码。Ldstr字段

这也可以通过运行这个示例来验证,该示例打印true:

Console.WriteLine(ReferenceEquals(nameof(Main), nameof(Main)));

如果编译后的输出是字符串字面值,它将被保留。字符串字面值在。net运行时中被存储。