2

我有一个List<T>并且我需要避免我将要概述的行为:

    // assume cls and numberToAdd are parameters passed in.
    int pos = numberToAdd;
    List<MyClass> objs = new List<MyClass>(numberToAdd);

    for(int i = 0; i < numberToAdd; i++)
    {
        objs.Add(cls);
        objs[i].X = -((pos * cls.Width) + cls.Width / 2);
        pos--;
    }

    Console.WriteLine(objs[0].X + "\r\n" + objs[1].X);

这会导致此 writeline 打印相同的值。

基本上我需要的是改变“添加”方法的行为。我想添加一个具有相同值的对象的新实例,而不仅仅是对同一对象的引用。我知道这将使用更多的内存。

4

5 回答 5

1

'cls' 变量是什么?只需在每个循环内创建一个新的。你想要做的是克隆它;但老实说,这会令人困惑。我建议每个循环只创建一个新的。

- 编辑

注意到您会评论“cls”。

我建议你克隆它(假设你不能改变调用并执行我上面的建议)。只需创建一个新属性,然后复制所有属性即可。

通常,如果您可以控制“cls”的类型,则只需创建一个“复制”构造函数。就像这样:

class Foo {
    private int x;

    public Foo (Foo toCopy) {
       this.x = toCopy.x;
    }

    ...
}
于 2009-08-19T00:33:22.863 回答
1

可能想要扩展 cls 以包含克隆方法。如果您无法修改 cls 类,扩展方法将起作用。

然后更改 objs.Add(cls); 到 objs.Add(cls.Clone());

于 2009-08-19T00:35:48.823 回答
1

啊。您需要将 cls 实现为结构,以便它表现出按值传递的语义。

或者您需要在您的 cls 对象上实现一个克隆方法,以便您可以创建一个方法来克隆该对象,从而创建一个对它的新引用,以便您可以执行此操作。

即使您无权访问对象本身,您也可以创建一个扩展方法来执行此操作。

public cls Clone(this cls)
{
    //initialise the object to clone it.
    return new cls(this.param1, this.param2,...) 
}
于 2009-08-19T00:36:29.293 回答
0

看起来像同一个对象, cls 正在将 numberToAdd 次添加到列表中。

您需要在循环内创建对象的新实例。

for(int i = 0; i < numberToAdd; i++)
{
    MyClass c=new MyClass(...);
    c.X = -((pos * c.Width) + c.Width / 2);
    objs.Add(c);
    pos--;
}
于 2009-08-19T00:37:39.450 回答
0

让 MyClass 实现ICloneable然后简单地使用

objs.Add((MyClass)cls.Clone());
于 2009-08-19T00:40:56.753 回答