gpt4 book ai didi

c# - 浅拷贝 - 引用类型的异常性质

转载 作者:行者123 更新时间:2023-11-30 14:05:05 27 4
gpt4 key购买 nike

我无法理解下面给出的两组代码片段的输出。怎么没有真正理解浅拷贝的概念。怎么解释呢?

类:

 public class Person : ICloneable
{
public string Name;
public int[] arr;
public object Clone()
{
return this.MemberwiseClone();
}
}

代码片段 1:

 static void Main(string[] args)
{
Person p1 = new Person();
p1.Name = "Name1";
p1.arr = new int[5] {1,2,3,4,5 };
Person p2 = (Person)p1.Clone();

p1.Name = "Name2";
p1.arr[0] = 11;

Console.WriteLine(p2.Name);
Console.WriteLine(p2.arr[0].ToString());
Console.Read();

}

输出:姓名111

疑惑:string不是引用类型吗。那么为什么 p2.Name 在片段 1 中打印为“Name1”

代码片段 2:

static void Main(string[] args)
{
Person p1 = new Person();
p1.Name = "Name1";
p1.arr = new int[5] { 1, 2, 3, 4, 5 };
Person p2 = (Person)p1.Clone();

p1.Name = "Name2";
p1.arr = new int[5] { 11, 12, 13, 14, 15 };

Console.WriteLine(p2.Name);
Console.WriteLine(p2.arr[0].ToString());
Console.Read();

}

输出:姓名11

最佳答案

您示例中的 int[] 数组是引用类型。这意味着,p1.arrp2.arr 都指向内存中的同一个数组。

如果你改变了p1.arr的第一个索引的值,这意味着p2.arr的第一个索引的值也被改变了。因此,代码片段 1 中的行为。

第二个代码片段的不同之处在于,您将引用 更改为p1 的数组。现在,p1.arr 是对新对象的引用。 p2.arr 仍然持有对“原始”数组的引用。因此,打印 p2.arr[0] 会打印 1。

编辑:

希望消除一些疑虑,如果您还记得打字,也许会更清楚:

p1.Name = "Name2";

实际上是:

p1.Name = new String("Name2");

这与您的 int[] 数组完全相同。您没有更改 p1.Name 的值,您正在创建一个新的字符串对象,更改 p1.Name 对该新字符串对象的引用。 p2.Name 仍然持有它自己对“原始”字符串对象的引用,即“Name1”。通过更改 p1.Name 的引用, 引用不会更改。

关于c# - 浅拷贝 - 引用类型的异常性质,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/729788/

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