我想做这样的事情:
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并且项目未从列表中删除。我的代码出了什么问题?
答案 0 :(得分:3)
这是一个时间问题。
您正在构造函数中调用calculationDone()
,之前可以将实例分配给调用方法中的列表。
只有当构造函数(和计算)完成时,才会将项添加到列表中。
public MyClass(BaseClass baseClass)
{
this.baseClass = baseClass;
// DO SOMETHING
calculationDone();
}
代码中的序列是:
这里的道德不是将对象的所有工作(整个生命周期)都放在构造函数中。拆分构造函数和计算时,它变为:
private void addData()
{
var temp =new MyClass(this);
list.Add(temp);
temp.DoCalculations(); // includes calculationDone()
}
这将按预期工作。
答案 1 :(得分: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
的正确实例。
答案 2 :(得分:0)
调用addData
时的事件序列是:
new MyClass(this)
被称为MyClass(baseClass)
构造函数calculationDone
方法
因此,在添加之前,您要从列表中删除MyClass
实例。我建议避免构造函数中的任何繁重工作,并将其卸载到Execute
(或类似命名的)方法。