这是否可以立即调用dispose并取消订阅此上下文中的事件? context_用于管理一个简单的状态机,我们基本上通过创建一个新的状态来启动和停止。
class ClassA
{
StateContext context_;
void SomeMethod()
{
if(context_ != null)
context_.Dispose();
context_ = new StateContext();
}
class StateContext : IDisposable
{
SubClassA()
{
//Subscribe to an event
}
void Dispose()
{
//unsubscribe to an Event
}
}
}
答案 0 :(得分:1)
一个行为良好的对象除了调用Dispose
之外不应该要求清理。如果一个对象订阅了可能比其他对象更长的事件,它必须(表现良好)确保以某种方式清理这些事件。这可以通过使用弱事件,或通过让Dispose
处理事件订阅来完成。
请注意,术语“非托管资源”与术语“非托管代码”的关系最小,而来自长期对象的普通事件是非托管资源。因此,即使事件与非托管代码无关,使用IDisposable
清除它们也是完全正确的。实际上,我建议这种清理应该被认为是强制性的,除非存在确保清理的其他方法(例如,事件由弱事件管理器处理,或者事件被订阅的对象不会超过订阅者)。 WinForms代码通常是草率的,假设事件发布者不会超过订阅者,但这并不意味着这种邋is应该被认为是可取的。