我必须删除处理程序吗

Do I have to remove the handler

我对 C# 和 GC 的研究越深入,我发现越来越多的事情我不太确定。我一直认为只有在我的 类.

中有一些非托管资源时才需要 Dispose 和相应的 Finalizer

但我有很多情况只有原生 C# 类 我不太清楚是否需要 Dispose 和相应的终结器。例如,当我将事件处理程序附加到我的事件时。

调用 Dispose 时是否需要删除事件处理程序。另外有人告诉我,如果事件处理程序仍然附加,则该对象可能不会被收集。如果是这种情况,GC 会以某种方式受到损害。

是否可以总结一下何时以及如何实现 Dispose 和 Finalizer?

事实上我对此有更多的疑问,但也许这个问题的答案可以帮助我进一步。

要解决关于何时进行处理和完成的一般性问题:

如果您的 class 中有一个字段是 IntPtr(或其他类型的非托管资源,但 IntPtr 是最常见的)并且它是您的class负责清理该资源,然后您需要实施终结器。在那个终结器中,你也应该释放 IntPtr 点的任何资源。如果你没有 IntPtr 那么你坚持的 class 应该处理它自己的最终确定并且会实现 IDisposeable (见下一部分)

如果您的 class 中有一个字段实现了 IDisposable 并且您的 class 负责在该对象之后进行清理,那么您的 class 也应该实现 IDisposable 并且在该处理方法中,您应该在对象上调用 Dispose()

对于事件处理程序,这是个人喜好问题。你可以,但只有你做与不做才重要 if the person who subscribed to the event messed up their code.

Unless you expect the publisher of the event to outlive the subscriber, there's no reason to remove the event handler...

我个人不这样做,但我知道有些人这样做。如果您想这样做,该过程只需在您的处置方法中将事件处理程序设置为 null

public sealed class Example : IDisposable 
{
    public EventHandler MyEvent;

    public void Dispose()
    {
        MyEvent = null;
    }
}

编辑:: You never need a finalizer, if you have a unmanaged resource that would need a finalizer it should get wrapped up in a SafeHandle 包装器为您处理最终确定的好处。一旦你这样做了,这个对象就变成了另一个正常的 IDisposable 你需要在你的 .Dispose() 方法中处理。