Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重新分配类索引的数组(引用类型)_C#_Arrays_Reference - Fatal编程技术网

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
A
struct
改为它做您想要的事情。
Collection[1] = Collection[0].Clone();