克隆是浅拷贝的一种方式。字符串是引用类型。为什么s2的改变不会影响s1?
private void button3_Click(object sender, EventArgs e)
{
string[] s1 = { "a", "b" };
string[] s2 = new string[2];
s2 = (string[])s1.Clone();
//s2=s1; //when Direct assignment s1 changed too
s2[1] = "e";
foreach (var s in s1)
{
this.richTextBox1.Text += s+",";
}
this.richTextBox1.Text += System.Environment.NewLine;
foreach (var s in s2)
{
this.richTextBox1.Text += s + ",";
}
}
}
输出: 一个,乙, 一个,一个, 浅拷贝时,应该是:a,e, a,e
最佳答案
当您克隆 s1
到s2
时,它们是两个完全独立的对象,位于不同的位置。
s1[1]
持有对持有 b
的位置的引用,s2[1]
也是如此。然后,您为 s2[1]
分配一个不同的引用 - 一个到不同的位置。这不会以任何方式影响 s1[1]
。
毕竟,您还没有更改保存 b
的位置。
当您分配 s2 = s1;
时,两个变量都指向同一个对象 - 当您更改该对象时,两个变量都将反射(reflect)更改,因为它们指向同一个位置。
关于c# - 方法Array.Clone是浅拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165658/