继承 IDisposable 时我该怎么办,没有任何可处置的内容
本文关键字:任何可 IDisposable 我该怎么办 继承 | 更新日期: 2023-09-27 18:34:02
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()
{
}
}
换句话说,"处置"的对象必须扔吗?
仅当调用方尝试执行由于对象已释放而无法执行的操作时,才应引发异常。 如果他们尝试执行的操作即使在对象被释放后也能正常工作,则没有理由抛出。
当然,如果你想扔,当然欢迎你。 归根结底,这是你的决定,但是,与方法/属性依赖于不再存在的资源的情况不同,不再有理由迫使你抛出。
从文档中:
如果没有要释放的其他资源,请提供空的
Dispose
实现。
在"实施者说明"下还有其他建议,我也会考虑。(使非泛型属性/方法显式实现等(
一旦一个对象被释放,它所做的任何关于可用的承诺都将失效,但这并不意味着该对象承诺变得不可用。 如果一个对象由于被释放而无法执行请求的操作,它应该抛出ObjectDisposedException
而不是以其他方式失败,但能够在不需要任何外部资源的情况下接受请求的对象可以自由地这样做。
至于你应该如何实现IDisposable
,如果你打算要求所有使用你的类型的代码都调用Dispose
,我建议你遵循IDisposable
模式并有一个公共Dispose
,如果你希望暗示不需要调用dispose对你的类型的引用。 如果声明为返回您的类型的工厂方法可能会返回需要处置的派生类型的新构造实例(例如 IEnumerable<T>.GetEnumerator()
(,则您的类型应该设计为鼓励客户端代码调用Dispose
,但除此之外可能没有必要。