这已经被问了很多次,但我在互联网上找不到一个提到这个问题的地方。
情况太简单,不能相信它没有解决方案:
public class BaseDispose : IDisposable
{
void IDisposable.Dispose()
{
}
}
public class ChildDispose : BaseDispose, IDisposable
{
void IDisposable.Dispose()
{
//var disp = base as IDisposable;
//(base as IDisposable).Dispose();
}
}
有一个具有非托管资源的基类。出于某种原因,它通过IDisposable的隐式实现来处理它们。有一个派生自这个基类的类,它必须摆脱他自己和父母的资源。
如何在c#中完成?我在上面注释掉的两行都会导致编译错误
答案 0 :(得分:1)
如果您可以访问这两个类,那么请更改它们以正确实现Disposable pattern
如果您无权访问基类,那么另一件要尝试的是将Child类更改为而不是继承基类,但要将其实例包含为成员,并将其委托给您通常会拨打base
的地方
但是,如果你要将子类传递给期望基础的东西,那么这将不起作用,你将无法以多态方式处理它们。
否则我看不出你的特定泡菜的方法。
<强>更新强>
好的,反映了代码并进行了检查System.ServiceModel.ClientBase<TChannel>.Dispose()
我可以告诉你它只是调用它的Close()
方法,所以让你的处置方法调用base.Close()
在功能上是等价的,但显然不太理想
另外,你要么密封你的班级,要么正确实施IDispose(即不隐含地实施IDisposable
),不是吗?
进一步更新
应该可以调用Close()
而不是按照此处的说明进行处理Close & Dispose, which to call?
以下是ClientBase<T>
implementation的一个示例,其中包含了dispose方法,该方法有条件地调用Close()
或Abort()
希望这有帮助