C# StreamReader 尝试/最终

标签 c# .net

我今天有一个关于 StreamReader 类的问题。具体使用文件名参数初始化此类例如:

TextReader tr = new StreamReader(fileName);

显然,当此操作完成后,像这样关闭流很重要:

 tr.Close();

我想试试这个/最后,问题是我找不到办法做到这一点。以下是我发现的一些不起作用的变体:

    try
        {
            var serializer = new XmlSerializer(type);
            TextReader tr = new StreamReader(fileName);
            var obj = serializer.Deserialize(tr);
        }
    finally
        {
            tr.Close();    
        }

更糟的是:

     TextReader tr;  
        try
        {
            var serializer = new XmlSerializer(type);
            tr = new StreamReader(fileName);
            var obj = serializer.Deserialize(tr);
        }
        finally
        {
            tr.Close();    
        }

那么是否可以在 finally 中关闭 StreamReader?

最佳答案

最简单的方法是使用 using 语句:

using (TextReader tr = new StreamReader(fileName))
{
  // ...
}

编译器会为你生成一个try-finally block ,并在finally中放入调用Close(实际上是Dispose)的代码。

如果您需要明确地拼出 finally,您的第二个示例将起作用,除了您需要强制初始化 tr:

TextReader tr = null;

你当然会想要检查 finally block 中的 tr != null,以防在 tr = new StreamReader(...) 之前发生异常被执行了。

关于C# StreamReader 尝试/最终,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2166278/

相关文章:

c# - 无法编译结构

c# - ajax 中的 get 请求到 Controller 操作不起作用?

c# - 如何将 Expires Header 添加到 iis7 中的自定义文件?

c# - 如何从服务访问当前登录用户的 HKCU 注册表?

c# - Entity Framework 使用模型与 sqlce 和 sql server/sql express 数据库

c# - 索引超出范围异常与参数超出范围异常

c# - 转换为十进制时出现 "Value was either too large or too small for a Decimal"错误

c# - 使 .NET SqlConnection 不使用 Windows session 凭据

.net - 调试 Visual Studio 2017 扩展未找到程序集

.net - 在同一解决方案中的不同项目中找不到 DB2 .NET dll (db2app.dll) 中的入口点