首页 > 解决方案 > 在 C# 中使用字符串连接时创建了多少个字符串对象

问题描述

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

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

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

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

标签: c#.netclr

解决方案


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"

推荐阅读