Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将具有相同值的两个不同字符串实例存储在堆中?_C#_String - Fatal编程技术网

C# 如何将具有相同值的两个不同字符串实例存储在堆中?

C# 如何将具有相同值的两个不同字符串实例存储在堆中?,c#,string,C#,String,详情如下: 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.ReferenceEqualsA,A1返回tr

详情如下:

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.ReferenceEqualsA,A1返回true,因为它们是两个相同的实例,我能理解这两个引用在堆中引用了相同的值吗?如果我错了,怎么能用字符串不可变来解释结果呢

对于object.ReferenceEqualsA,B返回false,AB.Substring0,1是否与A分别存储在堆中

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

string B = "AB".Substring(0,1);
在内部,子字符串分配一个新字符串,它不会执行其他语言/平台所做的子字符串切片优化,即使C字符串是不可变的,这是因为.NET字符串类的内部值表示不与其他实例共享字符串数组指针

您可以使用String.Intern:

A和A1变量在堆中存储对同一对象的引用,这是由于称为的机制。它是由编译器进行的优化,所以它只对文本有效。 B是在运行时计算的,因此它不会被放入池中

可以使用方法手动向池中添加值

此外,还可以对特定程序集禁用此机制,并在程序集级别添加CompliationRelaxations.NoStringInterning值

此优化不是针对.Net的,例如Java具有类似的字符串池以及-128到127的整数和其他一些基本类型。

是的,A和A1都是对同一对象的引用,而子字符串操作的结果是对单独对象的引用。A和A1是对同一对象的引用,因为
string B = "AB".Substring(0,1);