文件流在尝试和捕获,关闭读取器是多么重要

本文关键字:读取 文件 | 更新日期: 2023-09-27 18:33:51

我想确保在创建读取器后出现异常时关闭读取器。因此,我想在这次尝试和捕获中包含一个最后的括号。但是我不能在最后一个括号中关闭它,除非我在 try 括号上方声明了阅读器。但是如果我这样做,我在创建阅读器时不会发现任何异常。我不确定关闭阅读器与否有多重要。

XmlSerializer xmlSr = new XmlSerializer(typeof(List<ProjectObject>));
try
{
    FileStream reader = new FileStream(mTextFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
    List<ProjectObject> addProjects = (List<ProjectObject>)xmlSr.Deserialize(reader);
    mSharedDriveLocalProjects = addProjects;
    reader.Close();
}
catch
{
    MessageBox.Show("Failed to load XML file");
}

以上是我的代码。这样更好吗?

XmlSerializer xmlSr = new XmlSerializer(typeof(List<ProjectObject>));
FileStream reader = new FileStream(mTextFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
try
{
    List<ProjectObject> addProjects = (List<ProjectObject>)xmlSr.Deserialize(reader);
    mSharedDriveLocalProjects = addProjects;
}
catch
{
    MessageBox.Show("Failed to load XML file");
}
finally
{
    reader.Close();
}

文件流在尝试和捕获,关闭读取器是多么重要

Using 语句就是为了解决这些难题

 XmlSerializer xmlSr = new XmlSerializer(typeof(List<ProjectObject>));
 using(FileStream reader = new FileStream(mTextFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
 {
     try
     {
         List<ProjectObject> addProjects = (List<ProjectObject>)xmlSr.Deserialize(reader);
         mSharedDriveLocalProjects = addProjects;
     }
     catch
     {
         MessageBox.Show("Failed to load XML file");
     }
}

在 using 语句中声明和创建的任何一次性对象都在块的出口处释放(调用对象的 dispose 方法,此方法通常注意清理所有内容,包括文件的关闭)

请注意,using 语句类似于 try/final,因此,如果您想捕获异常并向用户显示一条很好的错误消息或将其记录在某处,您仍然需要在代码周围显式准备一个 try/catch 块。

C# 和 .NET 库提供了一种很好的惯用方法来使用using关键字执行此操作:

using (var reader = new FileStream(mTextFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) {
    try {
        ...
    } catch {
        ...
    }
}

由于FileStreamIDisposable的,并且因为它的Dispose()方法调用Close(),因此将reader包装到using块中提供了一种方便的方法,可以确保流在完成后

关闭。