继承IDisposable时我该怎么办?

时间:2014-12-11 16:41:42

标签: c# .net idisposable

IEnumerator<T>继承了IDisposable,我必须实施Dispose,即使我无需处理。我还应该通过动议吗?

public sealed class NothingEnumerator<T> : IEnumerator<T>
{
    private bool disposed;

    public object Current
    {
        get
        {
            if (disposed) throw new ObjectDisposedException("NothingEnumerator");
            return default(T);
        }
    }

    public void Dispose()
    {
        disposed = true;
    }

    public bool MoveNext()
    {
        if (disposed) throw new ObjectDisposedException("NothingEnumerator");
        return false;
    }

    public void Reset()
    {
        if (disposed) throw new ObjectDisposedException("NothingEnumerator");
    }
}

或不?

public sealed class NothingEnumerator<T> : IEnumerator<T>
{
    public object Current
    {
        get { return default(T); }
    }

    public void Dispose()
    {
    }

    public bool MoveNext()
    {
        return false;
    }

    public void Reset()
    {
    }
}

换句话说,“处置”对象投掷吗?

3 个答案:

答案 0 :(得分:3)

当调用者尝试执行因处理对象而无法执行的操作时,您应该只抛出异常。如果他们试图执行的操作即使在对象被处理后也能正常工作,那么就没有理由抛出。

当然,如果你想要投掷,你肯定会受到欢迎。这是你在一天结束时做出的决定,但是,与方法/属性依赖于不再存在的资源的情况不同,不再是强迫你扔。

答案 1 :(得分:2)

来自the documentation

  

如果没有其他资源需要处理,请提供空的Dispose实施。

我还会考虑“实施者须知”中的其他建议。 (使非泛型属性/方法显式实现等)。

答案 2 :(得分:2)

一旦一个对象被处理掉,它所做的关于可用的任何承诺都变得无效,但这并不意味着该对象有望变得无法使用。如果一个对象由于被处置而无法执行请求的操作,它应该抛出ObjectDisposedException 而不是以其他方式失败,但是能够遵守请求的对象无需任何外部资源即可免费使用。

至于如何实施IDisposable,如果您打算要求所有代码使用您的类型调用,我建议您遵循IDisposable模式并公开Dispose { {1}},如果您希望暗示不需要在类型的引用上调用dispose,那么您只需要包含一个空的显式接口实现。如果声明为返回类型的工厂方法可能返回需要处理的新构造的派生类型实例(例如Dispose的情况),那么您的类型应设计为鼓励客户端代码调用{{ 1}},但除此之外可能没有必要。