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

时间:2014-04-01 08:50:28

标签: 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;
    }

    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”

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();

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

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