Sbo*_*odd 31 .net c# dispose idisposable
我是C#的新手,如果这是一个明显的问题,请道歉.
在MSDN Dispose示例中,它们定义的Dispose方法是非虚拟的.这是为什么?这对我来说似乎很奇怪 - 我希望IDisposable的子类具有自己的非托管资源,它只会覆盖Dispose并在自己的方法底部调用base.Dispose().
谢谢!
Cyl*_*Cat 14
典型的用法是Dispose()被重载,具有公共的非虚拟Dispose()方法和虚拟的受保护的Dispose(bool).公共Dispose()方法调用Dispose(true),子类可以使用此受保护的虚拟方法释放自己的resorces,并为父类调用base.Dispose(true).
如果拥有公共Dispose()方法的类也实现了终结器,则终结器调用Dispose(false),指示在垃圾回收期间调用了受保护的Dispose(bool)方法.
如果有终结器,则公共Dispose()方法还负责调用GC.SuppressFinalize()以确保终结器不再处于活动状态,并且永远不会被调用.这允许垃圾收集器正常处理类.具有活动终结器的类通常仅在gen0,gen1和gen2清理后作为最后的手段收集.
这当然不是一个明显的问题.这种模式特别选择,因为它在以下场景中运行良好:
虽然虚拟Dispose()方法可以在类不需要最终化的场景中工作,但是如果您确实需要最终化,它在场景中不能很好地工作,因为这些类型通常需要两种类型的清理.即:托管清理和非托管清理.出于这个原因,该Dispose(bool)方法被引入模式中.它可以防止重复清理代码(其他答案中缺少这一点),因为该Dispose()方法通常会清理托管和非托管资源,而终结器只能清理非托管资源.
虽然接口中的方法在通常意义上不是"虚拟的",但它们仍然可以在继承它们的类中实现.这显然是C#语言内置的一种便利,允许在不需要virtual关键字的情况下创建接口方法,并且无需override关键字即可实现方法.
因此,虽然IDisposable接口包含一个Dispose()方法,但它virtual前面没有关键字,也不必override在继承类中使用关键字来实现它.
通常的Dispose模式是在您自己的类中实现Dispose,然后在基类中调用Dispose以便它可以释放它拥有的资源,依此类推.
类型的Dispose方法应该释放它拥有的所有资源.它还应该通过调用其父类型的Dispose方法释放其基类型所拥有的所有资源.父类型的Dispose方法应释放它拥有的所有资源,然后调用其父类型的Dispose方法,通过基类型的层次结构传播此模式.
http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx