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