【问题标题】:Does ldstr internally implement newobj?ldstr 是否在内部实现 newobj?
【发布时间】:2012-04-24 01:38:17
【问题描述】:

众所周知,字符串是隐式实例化的,这意味着我们不必使用 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,我在哪里可以看到规范/详细信息来支持它?

【问题讨论】:

    标签: c# .net jit cil il


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      string 只是遵循 reference 对象类型的基本准则,这就是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
      

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

      【讨论】:

      • 是的。谁说它显示了?我表明在值类型上取消相同不会注入该指令。
      猜你喜欢
      • 2018-04-15
      • 1970-01-01
      • 2022-01-22
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多