在C#中使用字符串连接时创建了多少个字符串对象

时间:2019-02-28 05:56:49

标签: c# .net clr

我是C#的初学者,只是对字符串连接有疑问。

string str = "My name is";
str += "John"

Q1-C#(。NET)在Java中具有相同的概念字符串池吗?

Q2-创建了多少个字符串对象?

2 个答案:

答案 0 :(得分:4)

  

Q1-C#(。NET)在Java中具有相同的概念字符串池吗?

答案是否定的,̶使用字符串在C#̶不像字符串池在Java中,每个串是它自己的参考;

更正 :我必须针对Java进行研究...从概念上讲,这是同一件事,我对Java字符串池的详细信息感到误解< / em>

C#通常将其称为字符串实习

您可以在编码中的奇妙冒险中找到更多相关信息: Eric Lippert's Eststwhile Blog >

String interning and String.Empty

  

如果在一个编译单元中有两个相同的字符串文字,则   我们生成的代码可确保仅通过以下方式创建一个字符串对象   程序集中该文字所有实例的CLR。这个   优化称为“字符串实习”。

字符串实习是一种CLI功能,在某些情况下会重用字符串实例:

    通过string IL 命令创建的
  1. ldstr文字
  2. 使用string.Intern显式调用时

  

Q2-创建了多少个字符串对象?

由于C#中的字符串是不可变的,因此您从2条语句中获得了3条字符串分配

// 1st string
string str = "My name is";

// 2nd string
// "John"

// 3rd string, which is the concatenation of the first 2
str += "John"

答案 1 :(得分:1)

是的,有这样的事情。

公共语言运行库通过维护一个称为内部池的表来保存字符串存储,该表包含对在程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字字符串的实例在系统中仅存在一次。 source

对于您而言,我相信将会有三项分配。