【发布时间】:2014-04-06 14:31:08
【问题描述】:
说 SomeDisposable 的工厂实际上是在创建/返回一种看门狗 Wrapper
public class Wrapper : SomeDisposable
{
public new /*:(*/ Dispose() { ... };
}
调用者使用like
using (SomeDisposable sd = SomeDisposableFactory.Create(...))
{
} // Wrapper.Dispose() never called.
Wrapper.Dispose() 永远不会被调用。如果Dispose() 是虚拟的,那么Wrapper.Dispose() 将被调用。
IDisposable 接口不保证其他最佳实践方法virtual Dispose(bool) 确实存在或强制其是虚拟的,因此通常不能依赖它存在(这只是推荐的模式)。接口目前不允许对虚拟进行约束。
不将推荐的Dispose() 模式设为虚拟有哪些优点和缺点,这可以解决这个特殊的困境。 C# 是否应该允许通过接口强制使用虚拟方法(因为抽象类不像契约定义那样流行)。
【问题讨论】:
-
使用
new几乎总是一个坏主意。如果您使用代码分析,实际上会有一个警告正确实现 IDisposable 来检查此模式,包括Dispose(bool)方法:msdn.microsoft.com/en-us/library/ms244737.aspx
标签: c# .net dispose idisposable virtual-functions