从我能读到的内容,编译器只发出一个字符串而没有其他任何事情真的发生?
有没有理由说这个电话会议的结果无法实现?对于nameof(MyClass)
,如果它发生了很多,理论上它可能值得吗?
答案 0 :(得分:6)
是的,它将像任何其他字符串文字一样被实习。
这可以通过this TryRoslyn example来证明:
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
加载,这意味着它已被实习:
"公共语言基础结构(CLI)保证引用具有相同字符序列的两个元数据令牌的两个ldstr指令的结果精确地返回相同的字符串对象(称为"字符串的过程)实习&#34)"
这也可以通过运行此示例来验证,该示例打印true
:
Console.WriteLine(ReferenceEquals(nameof(Main), nameof(Main)));
答案 1 :(得分:2)
如果编译的输出是一个字符串文字,它将被实习。字符串文字在.NET运行时中实现。