从我可以读取编译器只是发出一个字符串,没有其他真正发生?
有什么原因导致这个电话的结果不能被保留吗?对于一个nameof(MyClass)
来说,如果这种情况经常发生,理论上它可能是值得的?
是的,它将像任何其他字符串字面值一样被存储。
这可以通过下面的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运行时中被存储。