0

这必须被问过很多次,但我在互联网上找不到一个提到这个问题的地方。

情况太简单了,以至于无法相信它没有解决方案:

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# 中做到这一点?我在上面注释掉的两行都会导致编译错误

4

1 回答 1

1

如果您可以访问这两个类,请更改它们以正确实现Disposable 模式

如果您无权访问基类,那么要尝试的另一件事是将 Child 类更改为继承基类,而是包含它的一个实例作为成员,并在您通常调用的地方委托给它base.
但是,如果您必须将子类传递给期望基类的东西,这将不起作用,您将无法多态地对待它们。

否则我看不到你的腌菜的出路。

更新
好的,反映了代码并检查了System.ServiceModel.ClientBase<TChannel>.Dispose()我可以告诉你它只是调用它的Close()方法,所以让你的 dispose 方法调用base.Close()在功能上是等效的,但显然不太理想。

此外,您将密封您的课程或正确实施 IDispose (即不隐式实施IDisposable),不是吗?

进一步更新

应该可以调用Close()而不是处置,如关闭和处置,调用哪个?

这是一个ClientBase<T> 实现示例,包括它的 dispose 方法,它有条件地调用Close()Abort()

希望这可以帮助

于 2013-10-22T10:49:44.117 回答