簡體   English   中英

嘗試獲取FileStream,關閉閱讀器有多重要?

[英]FileStream in a try and catch, how critical is it to close the reader?

我想確保在出現異常時創建讀取器后關閉讀取器。 因此,我想在此嘗試和抓住中加入最后一個括號。 但是除非我在try括號之外聲明了讀者,否則我無法在final括號中關閉它。 但是,如果這樣做的話,在創建閱讀器時,我不會捕獲任何異常。 我不確定關閉讀者與關閉讀者有多重要。

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 / finally,因此,如果您想捕獲異常並向用戶顯示錯誤消息或將其記錄在某處,則仍需要在代碼周圍顯式准備try / catch塊。

C#和.NET庫提供了一種很好的慣用方式,可以using關鍵字:

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

由於FileStreamIDisposable ,並且因為它的Dispose()方法調用Close() ,所以將reader包裝到using塊中提供了一種方便的方法,以確保在完成流后將其關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM