4

从我可以阅读的内容来看,编译器只是发出一个字符串,而没有其他任何事情发生?

是否有任何理由无法对此次通话的结果进行实习?对于一个nameof(MyClass),如果它发生了很多,它可能,理论上是值得的?

4

2 回答 2

6

是的,它将像任何其他字符串文字一样被实习。

这可以通过以下 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这意味着它已被实习:

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

来自OpCodes.Ldstr 字段

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

Console.WriteLine(ReferenceEquals(nameof(Main), nameof(Main)));
于 2015-08-13T16:13:00.573 回答
2

如果编译后的输出是字符串文字,它将被实习。字符串文字在 .NET 运行时中被实习。

于 2015-08-13T16:06:52.993 回答