Close()
与Dispose()
相同或使用语句。即使调用了Close,是否有必要使用语句调用?。
我知道在处理一个对象之前,应该调用close,所以我们关闭了资源并且它可以用于Dispose
。
https://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx
说Close
与Dispose
相同。
答案 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)
不一定。我可以编写一个具有Close
和Dispose
方法且不相关的类。
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()
后,该对象被视为已标记为已完成,可能不再使用。