首页 > 解决方案 > 两个具有相同值的不同字符串实例如何存储在堆中?

问题描述

对于以下:

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

标签: c#string

解决方案


string A = "A";
string A1 = "A";

在上述情况下,编译器将A和设置A1为可执行映像中的相同字符串文字值。

string B = "AB".Substring(0,1);

在内部Substring分配一个新字符串,它不执行其他语言/平台所做的“子字符串切片”优化,即使 C# 字符串是不可变的,这是因为 .NETString类的内部值表示不与其他实例共享字符串数组指针。

您可以使用以下方法制作A相同B的内容String.Internhttps ://msdn.microsoft.com/en-us/library/system.string.intern(v=vs.110).aspx


推荐阅读