mse*_*edi 5 .net c# events eventhandler
我越是深入研究C#和GC,我发现越来越多的事情我不太确定.我一直认为只有在我的课程中有一些非托管资源时才需要Dispose和相应的Finalizer.
但是我有很多场合只有原生的C#类,如果我需要Dispose和相应的Finalizer,我不太清楚.例如,当我将事件处理程序附加到我的事件时.
当我调用Dispose时,是否需要删除事件处理程序.还有人告诉我,如果事件处理程序仍然附加,则可能无法收集该对象.如果是这种情况,GC会以某种方式受到损害.
是否可以总结我何时以及如何实现Dispose和Finalizer?
事实上,我对此有更多疑问,但也许这个问题的答案可以帮助我进一步.
要解决有关何时进行 Dispose 和 Finalize 的一般问题:
如果您的类中有一个字段是 a IntPtr(或某种其他类型的非托管资源,但 aIntPtr是最常见的),并且您的类有责任清理该资源,那么您需要实现终结器。在该终结器中,您IntPtr也应该取消分配点的任何资源。如果你没有 IntPtr 那么你持有的类应该处理它自己的终结并实现IDisposeable(参见下一部分)
如果您的类中有一个实现的字段IDisposable,并且您的类负责在该对象之后进行清理,那么您的类也应该实现IDisposable,并且您应该在该对象上调用该 dispose 方法Dispose()。
对于事件处理程序来说,这是个人喜好的问题。您可以,但只有您是否这样做才重要,如果订阅该活动的人弄乱了他们的代码。
除非您期望事件的发布者比订阅者活得更久,否则没有理由删除事件处理程序......
我个人不这样做,但我知道有些人这样做。如果您想这样做,该过程只需在您的 dispose 方法中设置事件处理程序即可null。
public sealed class Example : IDisposable
{
public EventHandler MyEvent;
public void Dispose()
{
MyEvent = null;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:汉斯·帕桑特在评论中提出了一个很好的观点:你永远不需要终结器,如果你有一个需要终结器的非托管资源,它应该被包装在一个SafeHandle包装器中来为你处理终结器。一旦你这样做了,该对象就变成了IDisposable你需要在你的方法中处理的另一个常态.Dispose()。
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |