6

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

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

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

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

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

4

2 回答 2

8

ldstr根据文档为您提供对文字字符串的引用(请记住,文字字符串默认情况下是实习的,因此它们只创建一次)。第一条语句按预期创建了string使用newobj指令的常规实例。

于 2012-04-11T18:05:06.170 回答
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

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

于 2012-04-11T18:05:41.953 回答