EventHandlers and C# Classes destructor/Dispose

2019-03-12 01:45发布

I'm a bit confused about C# Classes and their deconstructor.

I have to consume a few event handlers in a class instance I'm getting in the constructor:

 public Foo(IFooHandler handler)
 {
     handler.Load += Load;
     handler.Close += Close;
 }

I need to unsubscribe to that event when the Foo class is destroyed. Do I implement IDisposable and unsubscribe in there, or in a deconstructor? I need to consume those events, I can't do it another way.

For one of the classes, I create an instance, check progress, and then the class instance goes out of scope. For another it stays in the MainForm until the form is closed. The first is what I'm worried about because it may still have a reference to that event handler and not properly go.

I don't want to leak memory. When and how should I unsubscribe?

2条回答
神经病院院长
2楼-- · 2019-03-12 02:12

Don't do it in the destructor, because it won't be called while the event handlers are attached : when you attach an instance method of Foo as a handler for an event of Bar, Bar will hold a reference to Foo, so Foo won't be garbage collected, and its destructor won't be called.

You should implement IDisposable, and dispose your object explicitly

public void Dispose()
{
    if (handler != null)
    {
        handler.Load -= Load;
        handler.Close -= Close;
    }
}
查看更多
仙女界的扛把子
3楼-- · 2019-03-12 02:24

If you ever face the problem of having class A be a long lived class and class(es) B be short lived ones that subscribe to events of class A then you probably would be interested in the Weak Event Pattern. It can be a problem that you do not discover is one until it is to late i.e. Princeton self driving car.

查看更多
登录 后发表回答