【问题标题】:Is Close() same as Using statementClose() 是否与 Using 语句相同
【发布时间】:2017-03-10 13:20:09
【问题描述】:

Close() 是否与 Dispose() 相同或 using 语句。调用Close也要调用using语句吗?

我知道在处理一个对象之前,应该调用 close ,所以我们关闭资源并让它对Dispose 可用。

https://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx

CloseDispose 相同。

【问题讨论】:

  • 作为一般规则,您应该将 Using-statement 与实现 iDisposable 的所有内容一起使用,并且该对象将以正确的方式处置(和关闭)。
  • usingDispose 是通过 IDisposable 接口定义的。 Close 不是此定义的一部分,因此不能保证其行为方式相同。所以,答案是:不,Close() 通常与Dispose() 不一样
  • 我想不出一个 .Net 库类需要您在 Dispose 之前调用 Close 并且实际上任何实现良好的类都不应该。

标签: c# dispose using


【解决方案1】:

Close() 和 Using 语句一样吗?

不,不是。


您应该在using 之后调用Close() 吗?

不,它会因访问已处置的对象而中断。


我应该在退出using 块之前调用Close() 吗?

这很复杂。如果IDisposable 接口实现正确:否。否则:可能。


Close()IDisposable接口无关,见:https://msdn.microsoft.com/en-us/library/system.idisposable(v=vs.110).aspx

using 仅适用于IDisposable 继承对象,参见:https://msdn.microsoft.com/en-us/library/yh598w02.aspx

因此: Close()Dispose() 可能不会被视为有任何关联。

IDisposable 接口被正确实现时,你可以假设所有必要的清理工作都会被执行。这意味着将执行对Close() 方法的内部调用。这意味着不需要显式调用Close()

反过来;当对象是IDisposable 类型并公开Close() 方法时,对Close() 的调用将不足以正确处置/清理对象。 Dispose() 仍然必须调用,你可以直接调用,也可以通过using 语句调用。

您也可以让垃圾收集器为您处理 Dispose() 调用(如果正确实现,请参阅:Proper use of the IDisposable interface)但这被认为是不好的做法,因为您需要依赖正确的实现并拥有不能直接控制 GC 时间。

请注意,实现Close() 函数的原因通常是为开发人员提供一种重用对象的方法。调用Dispose() 后,该对象被视为已标记为终结,可能不再使用。

【讨论】:

    【解决方案2】:

    using 模式很有用,因为它包含一个try ... finally ...,可以防止异常...

    如果你这样做:

    FileStream fs = null;
    
    try
    {
        fs = File.OpenRead("MyFile.txt");
    }  
    finally
    {
        if (fs != null) 
        {
            fs.Close();
        }
    }
    

    那么在这种情况下几乎是等价的(因为Stream.Close()调用Dispose(true)

    但它仍然是“错误的”...除非您有非常好的理由(有一些不这样做的原因...有时对象的生命周期是非常非常难以跟踪。在这种情况下,通常可以不使用Dispose()。)。

    图案的概念是它应该成为你的一部分……如果你试图避开一个图案,那么在此之前或之后你会忘记它……为了什么?用于编写更容易出错的更多行?

    【讨论】:

      【解决方案3】:

      不一定。我可以编写一个具有不相关的CloseDispose 方法的类。

      class Foo : IDisposable
      {
          public void Close() { DoBar(); }
          public void Dispose() { DoBaz(); }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-05
        • 1970-01-01
        • 1970-01-01
        • 2020-10-25
        • 2021-06-10
        • 2017-10-07
        • 1970-01-01
        • 2020-04-15
        相关资源
        最近更新 更多