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

これにより、この書き込み行は同じ値を出力します。

基本的に必要なのは、「Add」メソッドの動作を変更することです。同じオブジェクトへの単なる参照ではなく、同じ値を持つオブジェクトの新しいインスタンスを追加したいと思います。これにより、より多くのメモリが使用されることを理解しています。

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を拡張してcloneメソッドを含めることができます。clsクラスを変更できない場合は、拡張メソッドが機能します。

次に、objs.Add(cls);を変更します。to objs.Add(cls.Clone());

于 2009-08-19T00:35:48.823 に答える
1

ああ。clsを構造体として実装して、値渡しのセマンティクスを示す必要があります。

または、clsオブジェクトにcloneメソッドを実装して、オブジェクトのクローンを作成するメソッドを作成し、それに対する新しい参照を作成して、これを実行できるようにする必要があります。

オブジェクト自体にアクセスできない場合でも、これを行うための拡張メソッドを作成できる場合があります。

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 に答える