2

私はこのようなものを作りたい:

class BaseClass
{
    private List<MyClass> list;

    private void addData()
    {
        list.Add(new MyClass(this));
    }

    public void removeData(MyClass data)
    {
        list.Remove(data);
    }
}

class MyClass
{
    private BaseClass baseClass;

    public MyClass(BaseClass baseClass)
    {
        this.baseClass = baseClass;

        // DO SOMETHING

        calculationDone();
    }

    private void calculationDone()
    {
        baseClass.removeData(this);
    }
}

私の問題は、list.Remove()false を返し、項目がリストから削除されないことです。私のコードの何が問題になっていますか?

4

3 に答える 3

3

It is a timing problem.

You are calling calculationDone() from the constructor, before the instance could have been assigned to the list in the calling method.

Only when the constructor (and the calculation) is done is the item added to the list.

public MyClass(BaseClass baseClass)
{
    this.baseClass = baseClass;

    // DO SOMETHING

    calculationDone();
}

The sequence in your code is:

  • addData()
    • constructor of X
      • calculationDone
      • list.Remove(X) // fails, X not found
    • List.Add(X)

The moral here is not to put all work (entire lifetime) of an object in the constructor. When you split the constructor and the calculation it becomes:

private void addData()
{
    var temp =new MyClass(this); 
    list.Add(temp);
    temp.DoCalculations();  // includes calculationDone()
}

and this will work as expected.

于 2013-09-18T10:24:28.843 に答える
0

addDataが呼び出されたときの一連のイベントは次のとおりです。

  1. new MyClass(this)と呼ばれる
  2. MyClass(baseClass)コンストラクターを実行します。
  3. calculationDoneメソッドを呼び出す
  4. ベースのリストからオブジェクトを削除しようとします
  5. オブジェクトが追加されていないため、削除は失敗します
  6. コンストラクタ終了
  7. アイテムがリストに追加されます。

MyClassそのため、インスタンスが追加される前に、リストからインスタンスを削除しています。コンストラクターでの重い作業を避け、それをExecute(または同様の名前の) メソッドにオフロードすることをお勧めします。

于 2013-09-18T10:28:26.967 に答える
0

あるthisクラスでは別のクラスとは異なるからthisです。

class BaseClass
{
  ....
   list.Add(new MyClass(this)); //new MyClass created and pushed on the list 
  ...
}

そして中MyClass

class MyClass  {
   private void calculationDone()
   {
     baseClass.removeData(this); //this is not inside the list
   }
}

つまり、MyClassオブジェクトとの間に関連付けを作成する必要があるため、 の正しいインスタンスBaseClass到達する可能性があります。MyClass

于 2013-09-18T10:21:00.037 に答える