ldstr在内部实现newobj吗?

众所周知,字符串是隐式实例化的,这意味着我们不必使用new来获取对象的对象的引用。

因此,我始终相信框架正在处理这个问题,因此如果我做了类似的事情,我会得到相同的IL:

 String first = new String(new char[] {'a'}); string second = "a"; 

然而,似乎第一行是使用newobj instance void [mscorlib]System.String::.ctor(char[])和第二行ldstr "a"

所以为了获得一个字符串引用, ldstr内部调用newobj ,在哪里可以看到规范/细节来支持它?

ldstr为您提供了对文字字符串的引用(请记住文字字符串是默认实现的,因此它们只创建一次)。 第一个语句按预期使用newobj指令创建string的常规实例。

string只是遵循参考对象类型的基本准则,这就是为什么在new你看到newobj

事实上,如果你尝试写这样的东西,它将不会生成newobj

 int a = new int(); a = 2; Console.WriteLine(a); 

由此产生的IL将是

 IL_0000: ldc.i4.0 IL_0001: stloc.0 IL_0002: ldc.i4.2 IL_0003: stloc.0 IL_0004: ldloc.0 IL_0005: call System.Console.WriteLine 

如果你写的只是

 int a = 2; Console.WriteLine(a); 

结果IL会

 IL_0000: ldc.i4.2 IL_0001: stloc.0 IL_0002: ldloc.0 IL_0003: call System.Console.WriteLine 

从分配的角度来看没有区别(自然有遗漏线),因为我们在谈论价值类型。