gpt4 book ai didi

c# - C#中的数组是引用类型,为什么它们充当值类型?

转载 作者:太空狗 更新时间:2023-10-29 20:43:48 28 4
gpt4 key购买 nike

根据 MSDN,如果所有数组都是引用类型,那么为什么在给定的示例代码中,t2 的新值没有反射(reflect) t1 的变化?

string[] data = new[] { "One", "Two" };

var t1 = data[0];

Console.WriteLine(t1);

var t2 = t1;
t2 = "Three"; //assigning the new value, and this should reflect in t1

Console.WriteLine(t2);
Console.WriteLine(t1); // this should print 'Three', but it prints 'One'

Console.Read();

enter image description here

http://msdn.microsoft.com/en-us/magazine/cc301755.aspx

Arrays are mechanisms that allow you to treat several items as a single collection. The Microsoft® .NET Common Language Runtime (CLR) supports single-dimensional arrays, multidimensional arrays, and jagged arrays (arrays of arrays). All array types are implicitly derived from System.Array, which itself is derived from System.Object. This means that all arrays are always reference types which are allocated on the managed heap, and your app's variable contains a reference to the array and not the array itself.

最佳答案

一张图片胜过一千个字,所以这里是发生了什么:

Before and After

“三”赋值给t2的效果是赋值前t1t2引用了同一个对象,但在赋值后它们引用了不同的对象。这里没有其他事情发生。

如果你有一个可变对象数组,并且操纵它们的值而不是设置它们的引用,情况就会不同。例如,假设用 StringBuilder 对象数组替换字符串数组,并调用 t2.Replace("Two", "Three") 而不是赋值。现在效果会有所不同,因为 t1t2data[0] 将指向同一个对象。

关于c# - C#中的数组是引用类型,为什么它们充当值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29032237/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com