列表 - 如何通过引用查找项目

本文关键字:查找 项目 引用 何通过 列表 | 更新日期: 2023-09-27 18:31:58

我想做这样的东西:

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 并且项目不会从列表中删除。我的代码有什么问题?

列表 - 如何通过引用查找项目

这是一个时间问题。

您正在从构造函数调用calculationDone()然后才能将实例分配给调用方法中的列表。

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

public MyClass(BaseClass baseClass)
{
    this.baseClass = baseClass;
    // DO SOMETHING
    calculationDone();
}

代码中的顺序为:

  • addData()
    • X 的构造函数
      • 计算完成
      • 列表。删除 (X)//失败,找不到 X
    • 列表添加(X)

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

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

这将按预期工作。

调用 addData 时的事件序列为:

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

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

因为一个类中的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实例