Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Close()与Using语句相同_C#_Dispose_Using - Fatal编程技术网

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
,实际上任何实现良好的类都不应该这样做。