IDisposable
接口的目的是有序释放非托管资源。它与 using
关键字搭配使用,定义一个作用域,在该作用域结束后,相关的资源会被处理掉。
由于这个机制非常简洁,我一再尝试让类实现 IDisposable
以便能够滥用这个机制,以不符合其预期的方式来处理嵌套上下文等情况:
class Context : IDisposable
{
// Put a new context onto the stack
public static void PushContext() { ... }
// Remove the topmost context from the stack
private static void PopContext() { ... }
// Retrieve the topmost context
public static Context CurrentContext { get { ... } }
// Disposing of a context pops it from the stack
public void Dispose()
{
PopContext();
}
}
在调用代码中使用的示例:
using (Context.PushContext())
{
DoContextualStuff(Context.CurrentContext);
} // <-- the context is popped upon leaving the block
请注意,这只是一个例子,不是这个问题的主题。
Dispose()
在离开 using
语句范围时被调用的事实也可以被利用来实现各种依赖于作用域的东西,比如计时器。这也可以通过使用 try ... finally
结构来处理,但在那种情况下,程序员需要手动调用一些方法(例如 Context.Pop
),而 using
结构可以为其执行。
这种使用 IDisposable
的方式与其在文档中所述的预期目的不符,然而这种诱惑仍然存在。
有没有具体的原因说明这是一个坏主意,并永远打消我的幻想,例如垃圾收集、异常处理等方面的问题?或者我应该继续滥用这种语言概念,纵情享受?
FormExtensions.BeginForm
。 - Joe