Csharp/C#教程:ldstr在内部实现newobj吗?分享


ldstr在内部实现newobj吗?

众所周知,字符串是隐式实例化的,这意味着我们不必使用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为您提供了对文字字符串的引用(请记住文字字符串是默认实现的,因此它们只创建一次)。 第一个语句按预期使用newobj指令创建string的常规实例。

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 

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

上述就是C#学习教程:ldstr在内部实现newobj吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/983191.html

(0)
上一篇 2021年12月19日
下一篇 2021年12月19日

精彩推荐