Mar*_*ter 41 .net c# dispose idisposable
如果我在C#中编写一个实现IDisposable的类,为什么我不能简单地实现
public void Dispose(){ ... }
Run Code Online (Sandbox Code Playgroud)
处理释放任何非托管资源?
是
protected virtual void Dispose(bool disposing){ ... }
Run Code Online (Sandbox Code Playgroud)
总是必要的,有时是必要的,还是其他的东西?
Jon*_*eet 43
包括终结器,引入新的虚拟方法和"封装"原始处置方法的完整模式是非常通用的,涵盖所有基础.
除非你有非托管资源的直接句柄(几乎 不应该),否则你不需要终结器.
如果你密封你的班级(我现在可能已经知道我对密封类的看法 - 继承设计或禁止它),引入虚拟方法是没有意义的.
我不记得上次我IDisposable以"复杂"的方式实施而不是以最明显的方式实施,例如
public void Dispose()
{
somethingElse.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
有一点需要注意的是,如果您要使用非常强大的代码,那么您应该确保在处理后不要尝试做任何事情,并ObjectDisposedException在适当的时候抛出.对于世界各地的开发人员都会使用的类库来说,这是一个很好的建议,但如果这只是一个在你自己的工作区中使用的类,那么很多工作只会获得很少的收益.
Han*_*ant 14
MSFT文档中关于一次性模式存在一些偏见.您应该实现IDisposable有两个原因:
案例1在大多数代码中都很常见.案例2在Microsoft编写的代码中非常常见,它们是围绕非托管资源编写托管包装的代码,需要完成的代码.但是在你的代码中应该是非常罕见的.毕竟,你已经拥有了所有那些不错的.NET类来为你做脏工作.你只需要调用他们的Dispose()方法.
仅案例2需要一次性图案.微软需要经常使用它.你大部分时间都只需要简单的Dispose().
除了其他很棒的答案,您可能需要查看这些文章: