正如我们都知道的字符串隐式实例化的,这意味着我们没有使用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
给你作为参考文本字符串每个文件 (记得文字串的每默认拘禁,所以他们只创造了一次)。 第一条语句创建的规则实例string
使用newobj
指令预期。
string
简单地遵循参考的对象类型THA基本方针,这就是为什么在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
但从配置来看没有什么区别(有遗漏线自然),因为我们正在谈论的值类型。