请考虑以下代码:
//Written in a WPF project, simply attach the handler to a button for testing code.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public class A
{
public int X;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
A[] Collection = new A[2];
for (int i = 0; i < Collection.Length; i++)
{
Collection[i] = new A();
}
Collection[0].X = 1;
Collection[1] = Collection[0];
Collection[0].X = 2;
MessageBox.Show("Collection[0].X = " + Collection[0].X + ", Collection[1].X = " + Collection[1].X);
//The messagebox produces: "Collection[0].X = 2, Collection[1].X = 2"
//Wanted behaviour: "Collection[0].X = 2, Collection[1].X = 1"
}
}
由于类数组Collection是一个引用类型。 Collection [0]指向Collection [1]所执行的相同内存区域。
我的问题是,如何将Collection [0]值“复制”到Collection [1],以便我得到以下输出:
“收藏[0] .X = 2,收藏[1] .X = 1”
答案 0 :(得分:1)
如果要克隆的类与示例中一样简单,则可以使用MemberwiseClone方法创建对象的浅表副本。为此,您需要在类中实现一个访问MemberwiseClone的方法,因为它受到保护:
public class A
{
public int X;
public A Clone()
{
return (A) MemberwiseClone();
}
}
然后更改行
Collection[1] = Collection[0];
到
Collection[1] = Collection[0].Clone();
在更复杂的场景中,您需要创建自己的机制来创建对象的深层副本(例如,使用序列化手动创建新对象)。
有关详细信息,另请参阅上述链接中的示例。