Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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#_C# 4.0 - Fatal编程技术网

C# 对象引用行为

C# 对象引用行为,c#,c#-4.0,C#,C# 4.0,在下面的代码片段中,我有两个变量firstString和secondString,它们具有相同的值“Hello”。因此,两个变量的引用位置相同 var firstString = "Hello"; var secondString = "Hello"; bool isSameReference = Object.ReferenceEquals(firstString, secondString); //same reference for both variables 但是将secondStr

在下面的代码片段中,我有两个变量
firstString
secondString
,它们具有相同的值“Hello”。因此,两个变量的引用位置相同

var firstString = "Hello";
var secondString = "Hello";
bool isSameReference = Object.ReferenceEquals(firstString, secondString);
//same reference for both variables
但是将
secondString
值更新为“嘿”不会更新
firstString
,即使它引用了相同的位置。为什么这些变量没有得到更新,因为它们引用了相同的引用位置

secondString = "Hey..";
isSameReference = Object.ReferenceEquals(firstString, secondString); 
//reference changed but firstString not updated
secondString
更新为它的前一个值,如“Hello”会使引用相同

secondString = "Hello";
isSameReference = Object.ReferenceEquals(firstString, secondString); 
//now the reference for both variables are same

c#为什么会有这种行为,以及FRMAE如何在内部处理这种行为?提前感谢您

我们称之为实习的过程。你可以阅读更多关于字符串实习的内容。这使得在分配与现有内容完全相同的新sting时节省了一些空间和处理时间。此外,stings interning使字符串比较操作变得简单。这是可能的,因为
String
是不可变类型。

C#(.NET)在.NET堆中只保存每个字符串文本一次。“Hello”和“Hey…”字符串存储在.NET堆上的两个不同位置。最初,firstString和secondString都指向“Hello”位置。secondString=“嘿…”;只需将secondString变量更改为指向堆上“Hey…”所在的位置。您应该知道,字符串变量保存字符串实际所在的堆中位置的地址(引用)。

您没有更新字符串,而是更新了对字符串的引用,该字符串现在指向“hey…”,其中不包括对firstString的字符串“Hello”的引用。此外,“编译器”of c#将代码中的每个静态字符串收集在一个列表中,而不包含双精度字符,这就是为什么在不同位置上的两个不同的“Hello”是同一个字符串的原因,如果您比较它们的引用

您是如何观察“引用”的?是什么导致您认为两个字符串存储在同一地址?A
secondString=“-Hello”。子字符串(1)
将提供不同的引用。@Gusdor使用Object.ReferenceEquals方法事实上,此行为由编译器优化字符串数据的方式决定,项目中具有相同值的所有字符串将使用相同的物理内存,因为字符串是不可变的或只读的,我们不需要不同的内存来存储相同的字符串值。这是某种优化,尽管我们知道字符串是.NET中的引用类型