使用 C# 将文件加载到字符串变量中时,是不是需要显式关闭 C# 中的 StreamReader?
Posted
技术标签:
【中文标题】使用 C# 将文件加载到字符串变量中时,是不是需要显式关闭 C# 中的 StreamReader?【英文标题】:Do I need to explicitly close the StreamReader in C# when using it to load a file into a string variable?使用 C# 将文件加载到字符串变量中时,是否需要显式关闭 C# 中的 StreamReader? 【发布时间】:2011-05-07 09:28:27 【问题描述】:例子:
variable = new StreamReader( file ).ReadToEnd();
这可以接受吗?
【问题讨论】:
【参考方案1】:不,这不会关闭 StreamReader。你需要关闭它。 Using 为您执行此操作(并处理它以便更快地被 GC 处理):
using (StreamReader r = new StreamReader("file.txt"))
allFileText = r.ReadToEnd();
或者在 .Net 2 中,您可以使用新文件。静态成员,那么你不需要关闭任何东西:
variable = File.ReadAllText("file.txt");
【讨论】:
ReadAllText
已添加到 .Net 2.0 (msdn.microsoft.com/en-us/library/…)
感谢 Jared(编辑后的答案)。 TBH 我最近才遇到它。一旦你知道了一种方法,你通常会倾向于坚持有效的方法。
使用 StreamReader.ReadToEnd 与 File.ReadAllTest 时是否存在性能差异?【参考方案2】:
您应该始终处置您的资源。
// the using statement automatically disposes the streamreader because
// it implements the IDisposable interface
using( var reader = new StreamReader(file) )
variable = reader.ReadToEnd();
或者至少手动调用它:
reader = new StreamReader(file);
variable = reader.ReadToEnd();
reader.Close();
【讨论】:
对于不知道 using 语句会自动为您处理此问题的人来说,这会令人困惑。没有反对票,但也没有赞成票,因为这不是初学者理解的措辞。 添加评论以提供帮助 在第二个示例中,您根本不调用 Dispose() 。并且没有 try-catch 机制来确保调用 Close()。当你同时添加一个 try-catch 和一个 Dispose() 调用它只会产生一个 using,就像你的第一个例子。 这很好地解释了它,但它没有提到,正如 badbod99 和其他几个人所做的那样,“或者在 .Net 4 中,您可以使用新的 File.static 成员,那么您不需要关闭任何东西”【参考方案3】:您需要处置实现IDisposable
的对象。使用using
语句确保它在没有显式调用 Dispose 方法的情况下被释放。
using (var reader = new StreamReader(file))
variable = reader.ReadToEnd();
或者,使用File.ReadAllText(String)
variable = File.ReadAllText(file);
【讨论】:
+1 但我会说“如果您使用“使用”语句来确保它被处置,则无需明确关闭它。+1 因为这比措辞更清楚Dismissile 的回答。他的回答并没有说明 using 语句会为您处理资源,而不知道这一点的人会摸不着头脑。【参考方案4】:是的,无论何时创建一次性对象,都必须最好使用 using 语句来处理它
using (var reader = new StreamReader(file))
variable = reader.ReadToEnd(file);
在这种情况下,您可以只使用File.ReadAllText
方法来简化表达式
variable = File.ReadAllText(file);
【讨论】:
这很有帮助,尽管 badbod99 提供了更多细节。我假设这些细节是正确的,因为我只是进入 javascript 之外的代码。【参考方案5】:最好关闭StreamReader
。使用以下模板:
string contents;
using (StreamReader sr = new StreamReader(file))
contents = sr.ReadToEnd();
【讨论】:
【参考方案6】:最好使用 using 关键字;那么你不需要显式关闭任何东西。
【讨论】:
以上是关于使用 C# 将文件加载到字符串变量中时,是不是需要显式关闭 C# 中的 StreamReader?的主要内容,如果未能解决你的问题,请参考以下文章