C# 重新分配类索引的数组(引用类型)
考虑以下代码:C# 重新分配类索引的数组(引用类型),c#,arrays,reference,C#,Arrays,Reference,考虑以下代码: //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;
//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"
}
}
//在WPF项目中编写,只需将处理程序附加到按钮以测试代码。
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
公共A类
{
公共int X;
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
A[]集合=新的A[2];
for(int i=0;i
因为类的数组Collection是引用类型。集合[0]指向与集合[1]相同的内存区域
我的问题是,如何将集合[0]的值“复制”到集合[1],从而获得以下输出:
“集合[0]。X=2,集合[1]。X=1”如果要克隆的类与示例中一样简单,则可以使用MemberwiseClone方法创建对象的浅层副本。为此,您需要在类中实现一个方法,该方法在受保护时进行访问:
public class A
{
public int X;
public A Clone()
{
return (A) MemberwiseClone();
}
}
然后换行
Collection[1] = Collection[0];
到
在更复杂的场景中,您需要创建自己的机制来创建对象的深度副本(例如,使用序列化手动创建新对象)
有关详细信息,请参见上面链接中的示例。
MemberwiseClone
受保护,外部调用方通常不可用(除非该方法为同一类型)@marcGravel:谢谢您的提示。@Markus:太好了!非常感谢,我知道这个问题,但是因为我没有编写代码的经验而无法解决它,这让我非常沮丧。只是等待一分钟来标记答案被接受。只是说-值类型。。。如果您将class A
Astruct
改为它做您想要的事情。
Collection[1] = Collection[0].Clone();