我使用MVP设计模式创建Windows窗体应用程序。例如:
IViewInterface view = new FormSome();
IPresenter presenter = new Presenter(view);
在presenter构造函数中,我做了类似这样的事情:
public Presenter( IViewInterface view ) {
this.view = view;
this.view.someEvens += myMethod;
}
现在我的问题: 当我做这样的事情时会发生什么:
IViewInterface view;
{
view = new FormSome();
IPresenter presenter = new Presenter(view);
}
// if my presenter exists here?
我不想明确地从演示者调用任何方法。我只想要我的演示者处理视图的事件。 GC是否从内存中删除了我的演示者,或者GC知道我的演示者处理视图事件,所以只要视图存在,我的演示者也会存在吗?
我测试了它并且它有效。但是我不确定它是否有效,因为GC还没有破坏我的演示者,或者GC比我想的更聪明。
答案 0 :(得分:2)
演示者仍将保持“活着”,因为它是通过此处设置的事件引用的
this.view.someEvens += myMethod;
如果GC收集了视图,则演示者也会被销毁。
但请注意,目前您没有提及演示者!在您发布的代码剪断后,您无法再访问它了。
修改强>
顺便说一句,当我认为我已经销毁了一个类的所有实例时,这对我来说恰好是一个问题,但它们仍然是活跃的,因为我意外地将它们用作事件目标。我已经处理了TCP命令,即使它们不应该被处理。
这就是为什么我能说出你所问的实际情况: - )