0

我有类属性和值。我不知道如何克隆列表中的项目值。

public class Attribut : ICloneable
{
    public Attribut()
    { }

    public Attribut(List<Values> value)
    {
        this.Values = value;
    }

    public object Clone()
    {
        return this.MemberwiseClone();
    }

   //other members



    List<Values> values = new List<Values>();y

    public List<Values> Values
    {
        get { return values; }
        set { values = value; }
    }
}


[Serializable]
public class Values : ICloneable
{
    public Values()
    {
    }

    public Values(string name)
    {
        this.Name = name;
    }

    public Values(string name, int count)
    {
        this.Name = name;
        this.Count = count;
    }

    public object Clone()
    {
        return this.MemberwiseClone();
    }

    string name;

    int count = 0;



    public int Count
    {
        get { return count; }
        set { count = value; }
    }

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

当我调用此方法时克隆值有问题(attrList)是全局变量)当我将新值添加到列表中时,同样的值也会添加到 attrList 中。

private List<Attribut> getSelectedColumns()
    {
        List<Attribut> list = new List<Attribut>();

        for (int i = 0; i < listView1.Items.Count; i++)
        {
            if (listView1.Items[i].Checked == true)
            {
                list.Add((Attribut)attrList[i].Clone());
                for(int j= 0; j < attrList[i].Values.Count;j++)
                {
                    list[j].Values.Add((Values)attrList[i].Values[j].Clone());
                }
            }
        }
4

1 回答 1

4

我认为首先您需要了解浅拷贝深拷贝之间的区别。

简而言之,第一个只是复制引用(从而使两个对象引用相同的列表),而第二个创建“真实副本”。

因此,MemberwiseClone创建了shallow copy,而您似乎需要deep copy

在大多数情况下,深度复制需要自定义编程,因为只有您知道如何正确创建不同的对象(使用哪些构造函数、复制哪些属性、分配哪些资源等)。

例如,如果您的对象拥有一个文件处理程序,则由您和您的逻辑决定是否需要在克隆对象之间共享此文件,或者实际克隆文件本身。

因此,在您的情况下,最有可能的深层副本List<Value>应该如下所示:

    public object Clone()
    {
        var result = (Attribut)MemberwiseClone();
        result.values = values.Select(x => (Values)x.Clone()).ToList();
        return result;
    }

请务必为您不想在克隆之间共享的所有列表/对象反映此深层复制逻辑。

于 2013-04-12T10:01:38.023 回答