ldstr在内部实现newobj吗?

时间:2012-04-11 17:45:29

标签: c# .net jit cil il

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

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

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

但似乎第一行是使用newobj instance void [mscorlib]System.String::.ctor(char[])完成的  和第二个ldstr "a"

因此,为了获得字符串引用,ldstr在内部调用newobj,我在哪里可以看到规范/详细信息以备份它?

2 个答案:

答案 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

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