System.IDisposable接口的msdn文档指出:


  该接口的主要用途是释放非托管资源。


我想知道什么是替代用途。

例如,我们还需要IDisposable接口用于其他分配的资源,例如事件订阅等。

我们使用接口作为标记,以允许类实例知道何时不再从客户端使用它。客户和基础结构代码在不再需要实现代码的类的逻辑实例时,显式调用IDisposable.Dispose()。
与从接口包装的非托管资源没有关系。

当我们为这种行为选择IDisposable接口时,我们将其视为该接口的替代(未记录)使用。

您发现IDisposable有哪些替代用途?
他们合法吗? MSDN文档是否错误?

最佳答案

我认为您对文档的阅读是错误的。说与不受管理的资源无关的IDisposable的任何用法都没有记录,这有点像说没有计数的System.Int32的任何用法都没有记录。它是一个接口,没有实现,甚至没有功能可以开始区分已记录的内容和未记录的内容。

IDisposable的目的仅仅是为开发人员提供一种确定性地控制其对象的生存期的机制。碰巧的是,这主要是处理非托管资源的要求。

IDisposable的一种更流行的用法是using块语法糖。正如其他人提到的那样,using块给出了操作范围,我认为它们非常优雅。

示例1-时序块

StackOverflow使用mini profiler,该one使用using块来标识执行的嵌套区域:

using (profiler.Step("Doing complex stuff"))
{
    using (profiler.Step("Step A"))
    { // something more interesting here
        Thread.Sleep(100);
    }
    using (profiler.Step("Step B"))
    { // and here
        Thread.Sleep(250);
    }
}


不使用using的替代方法非常可怕,我什至不想在这里模拟它。

示例2-一次性操作

在.NET域驱动的设计圈子中,一次性动作模式制作回合存在不同的变化。 Ayende有Domain Events implementation,Udi Dahan在他的slightly different take on this中也有,Jimmmy Bogard有,但仍在Domain Events的上下文中。模式的症结在于,您想要在某些上下文中执行某些操作,然后让上下文恢复到完成后的状态。

Ayende提供了一个简单的示例:

class UsuallyReadOnly {
  //.. implementation
  public IDisposable AllowModification
  {
    get
    {
        _allowModification = true;
        return new DisposableAction(()=>{ _allowModification = false; } );
     }
  }
}


UsuallyReadOnly的用法:

UsuallyReadOnly foo = new UsuallyReadOnly();
using(foo.AllowModification)
{
  foo.Name = "Bar";
}

关于c# - IDisposable的替代用途是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6107766/

10-13 03:13