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