我想做这样的东西:
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 的构造函数
- 计算完成
- list.Remove(X)//失败,未找到 X
- 列表.Add(X)
- X 的构造函数
这里的道德是不要将对象的所有工作(整个生命周期)都放在构造函数中。当您拆分构造函数和计算时,它会变成:
private void addData()
{
var temp =new MyClass(this);
list.Add(temp);
temp.DoCalculations(); // includes calculationDone()
}
这将按预期工作。
关于c# - 列表 - 如何通过引用查找项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869611/