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

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

请考虑以下代码:

internal class A
{
     public int X;
}
private void test()
{
     A[] Collection = new A[2];
     Collection[0].X = 1;
     Collection[1] = Collection[0]
     Collection[0] = new A();
     Collection[0].X = 2;
     //The code above produces: Collection[1] displays 2, and Collection[0] displays 2.
     //Wanted behaviour: Collection[1] should display 1, and Collection[0] display 2.
}

由于类数组 Collection是引用类型。Collection[0] 指向与 Collection[1] 相同的内存区域。

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

收藏[1]。X 返回 1,集合 [0]。X 返回 2。

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

下面是一个例子

internal class A
{
     public int X;
}
private void test()
{
     A[] Collection = new A[2];
     Collection[0].X = 1;
       CopyPropertyValues(Collection[0],Collection[1]);
     Collection[0] = new A();
     Collection[0].X = 2;
}


public static void CopyPropertyValues(object source, object destination)
{
    var destProperties = destination.GetType().GetProperties();
    foreach (var sourceProperty in source.GetType().GetProperties())
    {
        foreach (var destProperty in destProperties)
        {
            if (destProperty.Name == sourceProperty.Name && 
        destProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType))
            {
                destProperty.SetValue(destination, sourceProperty.GetValue(
                    source, new object[] { }), new object[] { });
                break;
            }
        }
    }
}

你应该让类"A"实现一个"克隆"方法,然后代替:

Collection[1] = Collection[0];

用:

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

或者,您可以将类"A"更改为结构,但这会产生其他意想不到的后果。