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

这是一个时间问题。

在实例可能已分配给调用方法中的列表之前,您正在calculationDone()从构造函数调用。

只有当构造函数(和计算)完成时,才会将该项目添加到列表中。

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

    // DO SOMETHING

    calculationDone();
}

您的代码中的序列是:

  • 添加数据()
    • X 的构造函数
      • 计算完成
      • list.Remove(X) // 失败,X 未找到
    • List.Add(X)

这里的寓意是不要将对象的所有工作(整个生命周期)都放在构造函数中。当您拆分构造函数和计算时,它变为:

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

这将按预期工作。

于 2013-09-18T10:24:28.843 回答
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 回答
0

调用时的事件顺序addData是:

  1. new MyClass(this)被称为哪个
  2. 执行MyClass(baseClass)构造函数
  3. 调用该calculationDone方法
  4. 尝试从基地列表中删除对象
  5. 删除失败,因为没有添加对象
  6. 构造函数完成
  7. 该项目被添加到列表中。

因此,您正在MyClass从列表中删除该实例,甚至在它被添加之前。我建议避免在构造函数中进行任何繁重的工作,并将其卸载到Execute(或类似命名的)方法。

于 2013-09-18T10:28:26.967 回答