什么时候是file.close()必要的?

问题描述:

我在想,如果有必要在以下情况下调用它Close()(如果没有必要,为什么?)什么时候是file.close()必要的?

using (var file = System.IO.File.OpenText(myFilePath)) 
{ 
... 
} 

我相信,有必要在下列情况下

StreamWriter file2 = new System.IO.StreamWriter(myFilePath); 
newFileContents.ForEach(file2.WriteLine); 
file2.Close(); 

它是正确的吗?

编辑:

我想我的问题是密切() - 特定的,可能是阅读和写作之间的区别....

+0

到目前为止,我还没有看到一个值得我赞赏的答案。 – 2013-02-27 19:11:19

+2

第二个代码片段不正确,代码抛出异常时将无法关闭文件。 Close()作为单独的方法存在,主要是因为* using *语句并不总是合适的。有时你可能想要保持文件打开一段时间,超出一种方法。 – 2013-02-27 19:14:14

+0

@RobertHarvey:没有答案会被给予值得赞赏,因为所有的答案都已经给出(包括我的):) http://*.com/questions/278902/using-statement-vs-try-终于 http://*.com/questions/567138/when-should-i-use-using-blocks-in-c/568231 http://*.com/questions/614959/using-the-using-在c-sharp中的陈述 – IAbstract 2013-02-27 19:16:11

随着using构建你IDisposable.Dispose叫自动在代码块结束时关闭文件。如果您不使用using声明,则必须调用Close自己。

With using如果在退出using块之前出现问题,您还会自动获取内置的try/finally异常处理功能,该功能将更加优雅。这是使用using是一个好主意,而不是滚动你自己的另一个原因。

在你的情况using结构是简写:

StreamWriter file2 = new System.IO.StreamWriter(myFilePath); 
try 
{ 
    newFileContents.ForEach(file2.WriteLine); 
} 
finally 
{ 
    if (file2!= null) 
     ((IDisposable)file2).Dispose(); 
} 

如果你反编译的StreamWriter的实施处置,你会看到这个调用(其中包括):

this.stream.Close(); 
在finally块

(如果您需要绝对证明;-)

+1

最后,我可以upvote的答案。请注意''IDisposable'接口是在'TextWriter'中指定的,StreamWriter'继承 – 2013-02-27 19:12:48

+0

'使用()'是try/finally的简写,但是,finally块调用'Dispose()' – 2013-02-27 19:14:49

+0

我会注意到你对*的解释“使用结构是速记的:”*是错误的。从概念上讲,这很好,但你忘了'try/finally',这真的是最重要的部分。 – 2013-02-27 19:15:21

使用结构在到达脚本块末尾时调用对象的Dispose方法。此方法关闭文件。

无论何时您使用某个文件,您都需要确保调用Dispose或Close以让Windows知道该文件可以进行编辑。

我在想,如果有必要把它关闭()在下列情况下(如果没有必要,为什么?)

没有因为using声明对象的部署 - 从而消除非托管资源。

我相信它是在下列情况下

是的,这里就需要使非托管资源清理必要的。

正确。

  1. 如果包裹在使用子句,file.Close()不需要
  2. 如果不换,你是负责Close()Dispose()

这是没有必要因为Dispose()将关闭底层的文件。但是,由于这是一个实现细节,所以在完成流时明确呼叫Close()是一种好的做法。

OpenText返回StreamReader,它继承TextReader,其继承了IDisposable接口,其指定一个Dispose()方法。

using语句超出范围时,它会在StreamReader的Dispose()实现上调用Dispose()方法,这会依次关闭流(即底层文件)。整个事件被封装在try/finally,它保证了Dispose()将始终被调用。