重新分配类索引的数组(引用类型)

本文关键字:数组 引用类型 索引 分配 新分配 | 更新日期: 2023-09-27 17:55:35

请考虑以下代码:

//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] 相同的内存区域。

我的问题是,如何将集合 [0] 值"复制"到集合 [1],以便获得以下输出:

"收藏[0]。X = 2,集合[1]。X = 1"

重新分配类索引的数组(引用类型)

如果要克隆的类与示例中一样简单,则可以使用 MemberwiseClone 方法创建对象的浅表副本。为此,您需要在类中实现一个访问 MemberwiseClone 的方法,因为它受到保护:

public class A
{
    public int X;
    public A Clone()
    {
        return (A) MemberwiseClone();
    }
}

然后更改行

Collection[1] = Collection[0];

Collection[1] = Collection[0].Clone();

在更复杂的场景中,您需要创建自己的机制来创建对象的深层副本(例如,使用序列化手动创建新对象)。

有关详细信息,另请参阅上述链接中的示例。