[英]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 {
...
}
}
由於FileStream
是IDisposable
,並且因為它的Dispose()
方法調用Close()
,所以將reader
包裝到using
塊中提供了一種方便的方法,以確保在完成流后將其關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.