使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

当“自动”将数据从 S3 加载到 Redshift 表中时,大小写是不是重要? [复制]

使用 C# 检查 List 中是不是存在值

页面位于 iFrame 中时未保存会话变量

将 NSString 变量添加到 plist 文件中时出错

使用命令行将 csv 文件加载到大查询中时面临问题

当字符串保存在集合中时,c_str() 是不是仍然有效