我认为该框架的设计存在固有缺陷。让我解释:
1. [...] 我们框架中的几个对象,根据要求需要提供 event ObjectTerminated
。
这没有意义。如果一个对象已被终止,正如事件的名称所暗示的那样,那么我会假设它已经消失并且我无法再访问它。这提出了两个问题:
2. 我没有控制他们的生活。
那么谁在控制他们的一生呢?为什么他们没有责任在适当的时候进行或触发必要的清理工作?让我进一步详细说明这一点:
3. [...] 可以订阅此事件并清理一些非托管的东西 [...]
这个非托管的东西在哪里,哪个对象负责处理它?如果它是您自己的对象,那么为什么您的对象不处置它 - 为什么您要触发一个事件,以便其他人可以处置这些东西?这就像我在搬运邻居的垃圾,而不是他自己做。(我不是在说那里的老太太。)
如果它看起来像这样,您的课程会更有意义:
class SomeWorkflowControlObject : IDisposable
{
// the following event doesn't make sense, sorry.
// public event EventHandler<> ObjectTerminated;
private IntPtr _handleToUnmanagedResource;
~SomeWorkflowControlObject()
{
Dispose(explicitly: false);
}
public void Dispose()
{
Dispose(explicitly: true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool explicitly)
{
if (explicitly)
{
// free managed resources here; perhaps trigger an event 'Disposing'.
}
DisposeUnmanagedResource(_handleToUnmanagedResource);
}
}
也就是说,它是一些非托管资源的包装器,它自己负责处理这些资源,而不是其他人。因此,不再需要触发事件,以便其他人可以处置非托管资源,无论如何这些资源都应该隐藏在您的对象中。