2

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

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

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

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

4

2 回答 2

4

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

T̶h̶e̶ ̶a̶n̶s̶w̶e̶r̶ ̶i̶s̶ ̶n̶o̶,̶ ̶u̶s̶i̶n̶g̶ ̶s̶t̶r̶i̶n̶g̶s̶ ̶i̶n̶ ̶C̶#̶ ̶i̶s̶ ̶n̶o̶t̶ ̶l̶i̶k̶e̶ ̶t̶h̶e̶ ̶s̶t̶r̶i̶n̶g̶ ̶p̶o̶o̶l̶ ̶i̶n̶ ̶j̶a̶v̶a̶, each string is its own reference;

更正:我不得不为Java研究这个......它在概念上是一样的,我误会了Javas字符串池的细节

C# 通常称之为字符串实习

您可以在Fabulous Adventures In Coding阅读更多相关信息:Eric Lippert 的 Erstwhile 博客

字符串实习和 String.Empty

如果您在一个编译单元中有两个相同的字符串字面量,那么我们生成的代码可确保 CLR 只为程序集中该字面量的所有实例创建一个字符串对象。这种优化称为“字符串实习”。

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

  1. string文字,通过ldstr IL命令创建
  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"
于 2019-02-28T06:02:08.593 回答
1

是的,有这样的事情。

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

在你的情况下,我相信会有三个分配。

于 2019-02-28T06:02:15.963 回答