C# 为什么dispose通过接口可用

C# 为什么dispose通过接口可用,c#,interface,C#,Interface,据MSDN称,我研究C#中的接口已有一段时间了 “接口更适合于应用程序需要许多可能不相关的对象类型来提供某些功能的情况。” 当实现Dispose()而不是使用接口IDisposable时,我可以简单地定义3 Dispose()的方法&将其交给用户。我这里的问题是“Microsoft为什么创建IDisposable接口以及使用接口实现Dispose()的目的是什么” 这就是我的意思 //This method is used to release Managed Resources. publi

据MSDN称,我研究C#中的接口已有一段时间了

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

当实现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();
}

如果这个问题太愚蠢或太简单,我很抱歉。请帮助我理解接口。

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

using(var c = new DisposableClass())
{
  //doing something
} //c.Dispose() is called
所以

使用
语句是一种非常(非常)有用的方法,可以确保清理内容,而不必编写一大堆样板文件来确保它发生(即使在异常情况下)


通过提供
IDisposable
界面,您可以宣传对象需要处理。如果没有它,Dispose可能会被忽略,并且工具(如FXCop)将无法处理此问题。

通过实现
IDisposable
接口,您告诉类的用户,当他处理完类时,应该调用
Dispose()
方法。 因此,用户将执行如下操作:

DisposableClass c = new DisposableClass();
//doing something
if (c is IDisposable)
  c.Dispose();
另外,
IDisposable
对象在使用
语句创建时会自动释放

using(var c = new DisposableClass())
{
  //doing something
} //c.Dispose() is called

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

允许我们类的用户决定如何处置其资源是一个非常糟糕的主意。为什么要公开您拥有托管或非托管资源的事实?只需公开
Dispose
您就可以告诉用户,他们需要请您清理,但他们不需要知道原因。仅供参考,这是一本不错的读物-不止一个原因,但最重要的是.NET不支持多重继承。如果您实际上需要自己释放非托管资源(99.9%的时间是错误的),那么您应该使用一次性模式并实现终结器。正确的做法是使用SafeHandle类包装它们。很少有人要自己写。