Close() 是否与 Using 语句相同

Is Close() same as Using statement

是否Close()等同于Dispose()或using语句。是不是调用了Close也要调用using语句?

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

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

表示 CloseDispose 相同。

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

如果你这样做:

FileStream fs = null;

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

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

但它仍然是 "wrong"... 你使用 using 代替 IDisposable 类 除非你有非常非常好的理由(有一些理由不这样做...有时很难跟踪对象的生命周期。在这种情况下,通常可以不 Dispose() 它。)。

模式的概念是它应该成为你的一部分......如果你试图避开一种模式,那么你会早晚忘记它......为了什么?为了写更多更容易出错的行?

不一定。我可以写一个 class,它有一个 Close 和一个不相关的 Dispose 方法。

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

Is Close() same as Using statement?

不,不是。


Should you call Close() after a using?

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


Should I call Close() before exiting the using block?

这很复杂。如果正确实现了 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/clean-up 对象。 Dispose() 仍然必须被调用,你可以直接调用,或者通过 using 语句。

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

请注意,实现 Close() 功能的原因通常是为开发人员提供重用对象的方法。调用 Dispose() 后,该对象被认为已标记为完成,不能再使用。