2016-04-15 75 views
3

我一直在接口上做研究,在C#中有一段时间了,根据MSDN为什么处理通过接口提供

“接口更适合于在您的应用程序需要很多可能毫无关联的对象类型情况提供某些功能。“

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

当实现Dispose()方法,而不是使用接口IDisposable的我可以简单地定义的Dispose()& 3种 方法把它交给user.My的问题在这里是“为什么微软创建IDisposable接口和什么是使用Interface实现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(); 
} 

我很抱歉,如果这个问题太愚蠢或simple.Please帮助我理解接口。

+0

允许我们班的用户决定如何处理其资源是一个非常糟糕的主意。你为什么要公开你有托管或非托管资源的事实?通过暴露'Dispose',你告诉用户他们需要让你清理,但他们不需要知道为什么。 – Sean

+0

仅供参考,它是一个很好的阅读 - http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface – Yogi

+0

不止一个原因,但在列表的顶部是肯定的.NET不支持多重继承。如果你真的需要自己释放非托管资源,做99.9%的时间是错误的,那么你应该使用一次性模式并实现终结器。正确的做法是用SafeHandle类来包装它们。很少有必要写自己的。 –

回答

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 

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

相关问题