Close()与Using语句相同

时间:2017-03-10 13:20:09

标签: c# dispose using

Close()Dispose()相同或使用语句。即使调用了Close,是否有必要使用语句调用?。

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

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

CloseDispose相同。

3 个答案:

答案 0 :(得分:0)

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

如果你这样做:

FileStream fs = null;

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

然后在这种情况下它几乎相同(因为Stream.Close()调用Dispose(true)

但它仍然是“错误的”...你使用using进行IDisposable课程除非你有一个非常好的理由(有一些理由不这样做...有时是一生一个对象非常难以跟踪。在这种情况下,通常没有Dispose()它。)。

模式的概念是它应该成为你的一部分......如果你试图从一个模式中脱身,那么之前或之后你会忘记它......为了什么?用于编写更容易出错的更多行?

答案 1 :(得分:0)

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

class Foo : IDisposeable
{
    public void Close() { doBar(); }
    public void Dispose() { doBaz(); }
}

答案 2 :(得分:0)

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()后,该对象被视为已标记为已完成,可能不再使用。