列表 - 如何通过引用查找项目
本文关键字:查找 项目 引用 何通过 列表 | 更新日期: 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)
- X 的构造函数
这里的寓意不是将对象的所有工作(整个生命周期)放在构造函数中。当您拆分构造函数和计算时,它将变为:
private void addData()
{
var temp =new MyClass(this);
list.Add(temp);
temp.DoCalculations(); // includes calculationDone()
}
这将按预期工作。
调用 addData
时的事件序列为:
-
new MyClass(this)
被称为 - 执行
MyClass(baseClass)
构造函数 - 调用
calculationDone
方法 - 尝试从基本列表中删除对象
- 删除失败,因为未添加对象
- 构造函数完成
- 该项将添加到列表中。
因此,您正在从列表中删除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
实例。