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
表示 Close
与 Dispose
相同。
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()
后,该对象被认为已标记为完成,不能再使用。
是否Close()
等同于Dispose()
或using语句。是不是调用了Close也要调用using语句?
我知道在处理一个对象之前,应该调用 close,所以我们关闭该资源并使其可供 Dispose
使用。
https://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx
表示 Close
与 Dispose
相同。
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 ausing
?
不,它会因访问已处置的对象而中断。
Should I call
Close()
before exiting theusing
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()
后,该对象被认为已标记为完成,不能再使用。