代码之家  ›  专栏  ›  技术社区  ›  Neil Barnwell

编译器是否优化了字符串文本?

  •  15
  • Neil Barnwell  · 技术社区  · 14 年前

    C#编译器或.NET CLR是否对字符串文本/常量进行了聪明的内存优化?我可以发誓我听说过“字符串内部化”的概念,所以在程序的任何两位代码中,字面意义上的“这是一个字符串”实际上指的是同一个对象(可能是安全的,字符串是不可变的是什么?)我在谷歌上找不到任何有用的参考资料。。。

    我听错了吗?别担心-我不会用这些信息在代码中做任何可怕的事情,只是想更好地理解它在封面下是如何工作的。

    4 回复  |  直到 6 年前
        1
  •  17
  •   Jon Skeet    14 年前

    编辑:虽然我强烈怀疑下面的语句对于所有C#编译器实现都是正确的,但我不确定它是否在规范中得到了保证 字面量 引用同一个字符串实例,但没有提到其他常量字符串表达式。我 犯罪嫌疑人 这是规范中的疏忽-我会给Mads和Eric发邮件。


    不仅仅是字符串文本。任何一根绳子 常数 . 例如,考虑:

    public const string X = "X";
    public const string Y = "Y";
    public const string XY = "XY";
    
    void Foo()
    {
        string z = X + Y;
    }
    

    编译器意识到这里的连接(对于 z )介于两个常量字符串之间,因此结果也是一个常量字符串。因此 z轴 将与的值相同 XY ,因为它们是具有相同值的编译时间常数。

    编辑:来自Mads和Eric的回复建议在Microsoft C#编译器字符串常量和字符串文本中 通常以相同的方式处理,但其他实现可能有所不同。

        2
  •  7
  •   Darin Dimitrov    14 年前

    This article 解释字符串实习相当好。引用:

    .NET有“实习生”的概念 游泳池”。基本上只是一套 但它能确保 引用同一字符串的时间 字面上,你得到了 相同的字符串。这可能是 语言依赖,但肯定是 在C#和VB.NET中是这样的,我会非常 很惊讶看到一种语言 等等,因为我很容易 做(可能比不做更容易 实习文学)。以及文字 被自动拘留,你可以 使用 实习方法,并检查是否 不是已经有实习生了 具有相同字符的字符串 在池中使用 输入法。这有点 不直观地返回字符串 如果一个相等的字符串是 在游泳池里,是指 返回字符串。否则,空值为 返回。同样,实习方法 返回对实习生的引用 字符串-传递的字符串 如果已经在游泳池里了,或者 新创建的实习字符串,或 已在 游泳池。

        3
  •  7
  •   CodesInChaos    14 年前

    是的,它确实优化了字符串文本。一个简单的例子,你可以看到:

    string s1="A";
    string s2="A";
    object.ReferenceEquals(s1,s2);  //true