C# Close()与Using语句相同
与C# Close()与Using语句相同,c#,dispose,using,C#,Dispose,Using,与Dispose()或using语句相同。即使调用了Close,也有必要调用using语句吗 我知道在处理一个对象之前,应该调用close,因此我们关闭资源,并允许它可用于处理 表示Close与Dispose相同,使用模式非常有用,因为它包含一个try。。。最后…这将防止异常 如果您这样做: FileStream fs = null; try { fs = File.OpenRead("MyFile.txt"); } finally { if (fs != null)
Dispose()
或using语句相同。即使调用了Close,也有必要调用using语句吗
我知道在处理一个对象之前,应该调用close,因此我们关闭资源,并允许它可用于处理
表示
Close
与Dispose
相同,使用模式非常有用,因为它包含一个try。。。最后…
这将防止异常
如果您这样做:
FileStream fs = null;
try
{
fs = File.OpenRead("MyFile.txt");
}
finally
{
if (fs != null)
{
fs.Close();
}
}
然后在这种情况下它几乎是等效的(因为Stream.Close()
调用Dispose(true)
)
但它仍然是“错误的”。。。除非有很好的理由(不这样做是有原因的……有时对象的生存期很难跟踪。在这种情况下,通常可以不使用Dispose()
it。),否则可以对IDisposable
类使用using
模式的概念是它应该成为你的一部分。。。如果你试图从一个模式裙子,那么之前或之后你会忘记它。。。为什么呢?写更多容易出错的行?不一定。我可以编写一个类,它有一个不相关的Close
和一个Dispose
方法
class Foo : IDisposable
{
public void Close() { DoBar(); }
public void Dispose() { DoBaz(); }
}
Close()
与IDisposable
接口无关,请参见:
使用
仅适用于继承的对象,请参见:
Close()
和Dispose()
可能没有任何关联。
正确实现IDisposable
接口后,您可以假定将执行所有必要的清理。这意味着将执行对Close()
方法的内部调用。这意味着不需要显式调用Close()
反过来说;当对象的类型为IDisposable
并公开Close()
方法时,调用Close()
将不足以正确处置/清理对象<仍然必须调用code>Dispose(),您可以直接或通过using
语句执行此操作
您也可以让垃圾收集器为您处理Dispose()
调用(如果正确实现,请参阅:),但这被认为是一种不好的做法,因为您需要依赖正确的实现,并且无法直接控制GC计时
请注意,实现
Close()
函数的原因通常是为开发人员提供重用对象的方法。调用Dispose()
后,该对象被视为已标记为完成,可能不再使用。作为一般规则,您应该与实现iDisposable的所有内容一起使用,并且该对象将被释放(并关闭)以正确的方式。使用
和处置
是通过IDisposable
界面定义的<代码>关闭不属于此定义的一部分,因此不能保证其行为方式相同。因此,答案是:不,Close()
通常与Dispose()
不同,我想不出有哪一个.Net库类要求您在Dispose
之前调用Close
,实际上任何实现良好的类都不应该这样做。