当前位置: 首页 > 编程语言 > C#

C#做字符串字面量是编译器优化的吗?分享

时间:2023-04-10 18:02:01 C#

C#做字符串字面量是编译器优化的吗?C#编译器或.NETCLR是否对字符串文字/常量进行了巧妙的内存优化?我可以发誓我听说过“字符串内化”的概念,所以在程序中的任何两位代码中,字面上的“这是一个字符串”实际上指的是同一个对象(大概是安全的,字符串是什么不可变的?)。我在谷歌上找不到任何有用的参考资料……我听错了吗?别担心——我不会在我的代码中使用这些信息做任何可怕的事情,只是想更好地了解它是如何工作的。编辑:虽然我强烈怀疑下面的声明适用于所有C#编译器实现,但我不确定它是否在规范中得到实际保证。规范的第2.4.4.5节讨论了引用同一字符串实例的文字,但没有提及其他常量字符串表达式。我怀疑这是规范中的一个疏忽——我会给Mads和Eric发邮件。这不仅仅是字符串文字。它是任何字符串常量。例如,考虑:publicconststringX="X";公共常量字符串Y="Y";公共常量字符串XY="XY";voidFoo(){字符串z=X+Y;}编译器在这里实现了两个常量字符串之间的连接(对于z),因此结果也是一个常量字符串。因此,z的初始值将与XY的初始值相同,因为它们是具有相同值的编译时常量。编辑:Mads和Eric的回复表明,字符串常量和字符串文字在MicrosoftC#编译器中通常以相同的方式处理-但其他实现可能不同。Thisarticle很好地解释了字符串实习。引用:.NET有“实习池”的概念。它基本上只是一组字符串,但它确保每次引用相同的字符串文字时,都会得到对相同字符串的引用。这可能取决于语言,但在C#和VB.NET中确实如此,如果看到它不起作用的语言,我会感到非常惊讶,因为IL使实习文学变得容易(可能比失败更容易)).除了自动驻留文字外,您还可以使用Intern方法手动驻留字符串,并使用IsInterned方法检查池中是否已存在具有相同字符序列的驻留字符串。返回字符串而不是布尔值有点不直观——如果池中有相同的字符串,则返回对该字符串的引用。否则,返回空值。同样,Intern方法返回对驻留字符串的引用——如果池中已存在则为传入的字符串,或者新创建的驻留字符串,或者池中已有的等效字符串。是的,它确实优化了字符串文字。一个简单的例子,如你所见:strings1="A";字符串s2="A";object.ReferenceEquals(s1,s2);//truehttp://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_intern_poolhttp://msdn.microsoft.com/en-us/library/system.string.isinterned.aspxhttp://msdn.microsoft.com/en-us/library/system.string.intern。aspx以上是C#学习教程:AreC#dostringliteralsbythecompileroptimized?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: