![](/img/trans.png)
[英]Do you need to call Flush() on a stream or writer if you are using the “using” statement?
[英]When do you need to call IDisposable, if you are using `using` statements?
我正在讀另一個答案。 它讓我想知道,如果我使用using
語句,何時需要顯式調用Dispose?
編輯:
只是為了證明自己不是一個無所謂,我問的原因是因為另一個線程上有人說某些暗示有一個很好的理由不得不手動調用Dispose ...所以我想,為什么不問一下呢?
你沒有。 using
語句為您完成。
根據MSDN ,這個代碼示例:
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
在編譯時,擴展為以下代碼(注意額外的花括號以創建對象的有限范圍):
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
注意:正如@timvw所提到的 ,如果在using語句本身鏈接方法或使用對象初始值設定項並拋出異常,則不會處理該對象。 如果你看看它將擴展到什么是有道理的。 例如:
using(var cat = new Cat().AsDog())
{
// Pretend a cat is a dog
}
擴展到
{
var cat = new Cat().AsDog(); // Throws
try
{
// Never reached
}
finally
{
if (cat != null)
((IDisposable)cat).Dispose();
}
}
AsDog
顯然會拋出異常,因為貓永遠不會像狗一樣棒。 然后貓永遠不會被處理掉。 當然,有些人可能會說貓永遠不會被處理掉,但這是另一個討論...
無論如何,只要確保你using( here )
所做的事情是安全的,你就可以去了。 (顯然,如果構造函數失敗,則不會創建對象,因此不需要處置)。
通常你沒有。 這是using語句的要點。 但是有一種情況你需要小心:
如果將變量重新分配給另一個值,則using語句將僅對原始值調用Dispose方法。
using (someValue = new DisposableObject())
{
someValue = someOtherValue;
}
編譯器甚至會給你一個警告 :
可能是對本地'someValue'的賦值不正確,它是using或lock語句的參數。 Dispose調用或解鎖將發生在本地的原始值上。
但是在使用c#3.0對象初始化器時要小心。 可以在此處找到一個示例: http : //ayende.com/Blog/archive/2009/01/15/avoid-object-initializers-amp-the-using-statement.aspx
決不。 一旦使用塊內的語句完成執行,它將調用Dispose。
using語句的重點是,如果你的對象實現了IDisposable,那么將在代碼塊的末尾調用dipose。 這就是它的用途,為你自動完成它。
我所知道的
using (var myDisposable = new MyDisposable())
{
...
}
基本上是由編譯器翻譯成的
var myDisposable = new MyDisposable()
try
{
...
}
finally
{
myDisposable.Dispose();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.