为什么通过接口提供dispose方法

3

我一直在研究C#中的接口问题,根据MSDN的说法:

“接口更适合应用程序需要许多可能无关的对象类型来提供某些功能的情况。”

https://msdn.microsoft.com/zh-cn/library/3b5b8ezk(v=vs.90).aspx

当实现Dispose()而不是使用IDisposable接口时,我只需定义3个Dispose()方法并将其提供给用户。我的问题是“为什么Microsoft创建了IDisposable接口,使用接口实现Dispose()的目的是什么”。

这就是我的意思。

//This method is used to release Managed Resources.
public void Dispose()
{
    this.Dispose();
}

//This method is used to release both managed & unmanaged Resources.
public void DisposeAll()
{
    this.Dispose();
    GC.SuppressFinalize(this);
    ReleaseUnmangedResources();
}

//This method is used to release only unmanaged Resources.
public void DisposeUnmanaged()
{
    ReleaseUnmangedResources();
}

如果我的问题太愚蠢或太简单,请原谅。请帮助我理解接口。


允许我们类的用户决定如何处理其资源是一个非常糟糕的想法。为什么要暴露您拥有托管或非托管资源的事实呢?通过仅公开“Dispose”,您告诉用户他们需要请求您进行清理,但他们不需要知道原因。 - Sean
仅供参考,这是一篇不错的阅读材料 - https://dev59.com/K3RB5IYBdhLWcg3wuZU1 - Yogi
有不止一个原因,但最重要的原因肯定是.NET不支持多重继承。如果您确实需要自己释放非托管资源(99.9%的情况下都是错误的做法),那么您应该使用可处理模式并实现终结器。正确的做法是使用SafeHandle类来包装它们。很少需要编写自己的类。 - Hans Passant
2个回答

4

IDisposable具有特殊的语言支持。任何实现了IDisposable接口的对象都可以作为using语句的主题。

因此,

using(var myDisposable = new ClassThatImplementsIDisposable())
{
      //do some stuff/ even throw an exception
}//myDisposable.Dispose() is automatically called, even if an exception happened.

using语句是一种非常(非常非常)有用的方式,可以确保在不编写大量样板代码的情况下清理东西(即使在异常情况下也是如此)。

提供IDisposable接口,您正在宣传对象需要处理。如果没有它,可能会忽略处理,并且工具(例如FXCop)将无法检测到。


0
通过实现 IDisposable 接口,您告诉您的类的用户,在使用完该类后应调用 Dispose() 方法。 因此,用户将执行以下操作:
DisposableClass c = new DisposableClass();
//doing something
if (c is IDisposable)
  c.Dispose();

此外,使用using语句创建的IDisposable对象会自动释放。
using(var c = new DisposableClass())
{
  //doing something
} //c.Dispose() is called

在这种情况下,即使在 using 块内抛出异常,也会调用 Dispose()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接