c# - 在 C# 中使用字符串连接时创建了多少个字符串对象
问题描述
我是 C# 的初学者,只是对字符串连接有一些疑问。
string str = "My name is";
str += "John"
Q1-C#(.NET)在Java中有相同的概念字符串池吗?
Q2-创建了多少个字符串对象?
解决方案
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 博客
如果您在一个编译单元中有两个相同的字符串字面量,那么我们生成的代码可确保 CLR 只为程序集中该字面量的所有实例创建一个字符串对象。这种优化称为“字符串实习”。
字符串实习是一项 CLI 功能,可在某些情况下重用字符串实例:
string
文字,通过ldstr
IL命令创建- 当使用显式调用时
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"
推荐阅读
- mysql - SQL - 计算所有文件扩展名
- objective-c - 使用 Swift 枚举覆盖 Swift 中的 Obj-C 方法
- scala - Scala - 如何将列附加到保留原始列名的 DataFrame?
- cpython - Python C-API 等效于“python -m module_name”(python 2.7)
- javascript - 我想要一个用于在 html 中而不是在 JQuery 中克隆表中的选择框的 javascript 代码
- coldfusion - CF2016 管理中的电子邮件无法投递选项中缺少分页部分
- android - Android单个Web View打开多个pdf
- sed - bash SED命令解释带分号
- java - java web应用中如何显示汉字?
- angularjs - AngularJS 无法成功调用 WebAPI 但 Fiddler 可以吗?