【问题标题】:Why is dispose made available through an interface为什么 dispose 可以通过接口使用
【发布时间】:2016-04-15 10:56:53
【问题描述】:

我一直在研究 C# 中的接口有一段时间了,根据 MSDN

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

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

当实现 Dispose() 而不是使用 IDisposable 接口时,我可以简单地定义 3 Dispose() 的方法并将其提供给用户。我的问题是“为什么微软创建了 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,您就可以告诉用户他们需要请您清理,但他们不需要知道原因。
  • 仅供参考,读起来不错-stackoverflow.com/questions/538060/…
  • 不止一个原因,但最重要的肯定是 .NET 不支持多重继承。如果您确实需要自己释放非托管资源,99.9% 的时间都做错了,那么您应该使用一次性模式并实现终结器。正确的做法是用 SafeHandle 类包装它们。很少需要自己编写。

标签: c# interface


【解决方案1】:

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)将无法处理。

【讨论】:

    【解决方案2】:

    通过实现IDisposable 接口,您是在告诉您的类的用户,当他完成该类时,他应该调用Dispose() 方法。 所以用户会做这样的事情:

    DisposableClass c = new DisposableClass();
    //doing something
    if (c is IDisposable)
      c.Dispose();
    

    此外,IDisposable 对象在使用 using 语句创建时会自动释放。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 2020-12-25
      • 2021-03-27
      • 2011-12-18
      相关资源
      最近更新 更多