2012-07-18 17 views
0

在一些代碼,我經常與工作(和已經寫了幾十倍),如下面的代碼已經被使用:最終阻止使用 - 它是否像最終的其他上下文一樣觸發?

using (StreamWriter sw = new FileWriter(".\SomeFile.txt")) 
{ 
    // Perform file IO here... 
} 
finally 
{ 
    sw.Close(); 
} 

我熟悉的try/catch /終於在C#...我知道這種情況終於有效。當我對術語「最終使用」進行谷歌搜索時,我發現沒有相關匹配。

的是否最後這種情況下工作,我在想,當使用聲明的最後命令,其中的finally塊得到執行的內容是什麼?或者我(和我正在使用的代碼庫)是否有這個錯誤;最後限制在Try/Catch?

+0

我以前從未見過這樣的'using' /'finally'組合。順便說一句,爲什麼明確調用'Close()'? – sloth 2012-07-18 14:03:34

+0

老實說,我不確定這是我最初從別人身上看到的代碼。我想,意圖是,對於某些非託管資源(文件IO,DB連接)清理需要手動進行,因爲無論A)一個dispose可以不定義,或b)處置可能無法收拾一切,取決於如何該「資源」的作者選擇實施它。 – 2012-07-18 14:27:43

回答

1

終於限於try/catch語句?

Yes。甲finally必須try塊之前。只有catch是可選的。除此之外,你應該讀一點關於scope。您在using塊中聲明的sw變量在該塊之外不可訪問。

此外,using將處置StreamWriterFileWriter是從Java ;-)一旦塊超出範圍(即當執行該塊中的最後一條指令),所以你不必放棄或關閉它手動。

0

最後總是工作,無論是否存在(未捕獲)異常不要緊

0

我相信,當一個using轉化爲IL - 淨轉換一個usingtry(的種類)反正 - 所以在這方面它仍然有意義。

See this article.

1

最後總是運行,但因爲它代表你的代碼主要是多餘的。代碼:

using (StreamWriter sw = new FileWriter(".\SomeFile.txt")) 
{ 
    // Perform file IO here... 
} 

在功能上等同於

{ 
    StreamWriter sw = new FileWriter(".\SomeFile.txt"); 
    try { 
     // Perform file IO here... 
    } 
    finally { 
     ((IDisposable)sw).Dispose(); 
    } 
} 

的StreamWriter的Dispose()方法隱式調用Close()方法。但是,這不應該是一個錯誤,因爲用戶定義的Finallys在系統隱式Finallys之前運行。

+1

反過來也是一樣:'StreamWriter.Close()'調用它的'Dispose'方法。 – sloth 2012-07-18 14:05:09

+0

哈哈,你讓我好奇,所以我雙重檢查反射器。有趣的是,我們都是對的。如果需要,Dispose()會調用this.stream.Close(),而Close()會立即調用Dispose()。 Pastebin在這裏:http://pastebin.com/BbcEqVwg – tmesser 2012-07-18 14:45:07