我们都知道字符串是隐式实例化的,这意味着我们不必使用new
来获取对象的对象的引用。
因此,我一直认为框架正在处理这个问题,因此如果我做了类似的事情,我会得到相同的IL:
String first = new String(new char[] {'a'});
string second = "a";
但似乎第一行是使用newobj instance void [mscorlib]System.String::.ctor(char[])
完成的
和第二个ldstr "a"
。
因此,为了获得字符串引用,ldstr
在内部调用newobj
,我在哪里可以看到规范/详细信息以备份它?
答案 0 :(得分:8)
ldstr
为您提供了对文字字符串的引用per the documentation(请记住默认情况下文字字符串是固定的,因此它们只创建一次)。第一个语句按预期使用string
指令创建newobj
的常规实例。
答案 1 :(得分:1)
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
从分配的角度来看没有区别(自然会有遗漏线),因为我们正在谈论价值类型。