当GC删除类时,它只处理事件

时间:2012-05-21 14:57:43

标签: c# garbage-collection

我使用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比我想的更聪明。

1 个答案:

答案 0 :(得分:2)

演示者仍将保持“活着”,因为它是通过此处设置的事件引用的

this.view.someEvens += myMethod;

如果GC收集了视图,则演示者也会被销毁。

但请注意,目前您没有提及演示者!在您发布的代码剪断后,您无法再访问它了。

修改
顺便说一句,当我认为我已经销毁了一个类的所有实例时,这对我来说恰好是一个问题,但它们仍然是活跃的,因为我意外地将它们用作事件目标。我已经处理了TCP命令,即使它们不应该被处理。

这就是为什么我能说出你所问的实际情况: - )