是否ldstr内部实现newobj?(Does ldstr internally implement

2019-09-16 12:18发布

正如我们都知道的字符串隐式实例化的,这意味着我们没有使用new ,为了得到一个的对象的引用。

因此它一直是我的信念,即框架照顾到这一点,因此,如果我做了这样的事情,我会得到相同的IL:

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

但是看来,第一行完成使用newobj instance void [mscorlib]System.String::.ctor(char[])和所述第二ldstr "a"

因此,为了获得一个字符串参考,并不ldstr内部调用newobj和我在哪里可以看到规格/细节来支持这一行动?

Answer 1:

ldstr给你作为参考文本字符串每个文件 (记得文字串的每默认拘禁,所以他们只创造了一次)。 第一条语句创建的规则实例string使用newobj指令预期。



Answer 2:

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

但从配置来看没有什么区别(有遗漏线自然),因为我们正在谈论的值类型。



文章来源: Does ldstr internally implement newobj?
标签: c# .net jit cil il