c# - 两个具有相同值的不同字符串实例如何存储在堆中?
问题描述
对于以下:
string A = "A";
string A1 = "A";
string B = "AB".Substring(0,1);
Console.WriteLine("{0}", object.ReferenceEquals(A, A1)); //Returns True
Console.WriteLine("{0}", object.ReferenceEquals(A, B)); //Returns Flase
object.ReferenceEquals(A, A1)
返回true,因为它们是两个相同的实例,我可以理解这两个引用堆中的相同值A
吗?如果我错了,结果如何解释String is immutable
?
对于object.ReferenceEquals(A, B)
返回 false,与?"AB".Substring(0,1)
分开存储在堆中A
解决方案
string A = "A";
string A1 = "A";
在上述情况下,编译器将A
和设置A1
为可执行映像中的相同字符串文字值。
string B = "AB".Substring(0,1);
在内部Substring
分配一个新字符串,它不执行其他语言/平台所做的“子字符串切片”优化,即使 C# 字符串是不可变的,这是因为 .NETString
类的内部值表示不与其他实例共享字符串数组指针。
您可以使用以下方法制作A
相同B
的内容String.Intern
:https ://msdn.microsoft.com/en-us/library/system.string.intern(v=vs.110).aspx
推荐阅读
- arrays - 字符串文件,在另一个文件中找到匹配的字符串
- html - 为移动设备放置 div 和响应式设计的问题,你能检查我的代码吗?
- javascript - 使用fabric js在对象内部自由绘图
- javascript - WordPress:ServiceWorker 的 Push.js 实现会导致问题
- wso2 - 通过代码 WSO2 Identity Server 配置服务提供者
- java - 每次刷新后在java中写入文件时查看文件的大小和内容(新添加的字符串)
- php - PHP:如何修复 array_pop 和值 0
- c# - C#-Mssql | 同网2台电脑同时连接公网数据库的问题
- python - 处理文本文件并将其导出为 csv 文件
- php - 使用 mysql 中的 json 字段获取页面内容