2011-01-06 54 views
6

可能重複:
What is the C# Using block and why should I use it?正在使用Better?

我的問題:使用using(a){do something with a}只是聲明瞭 'A',並使用它的方式更好。即:更安全,更快,...

查看示例澄清。

實施例1:(不使用)

StreamWriter sw; 
string line; 
sw = new StreamWriter("D:\\NewCon.xml"); 
sw.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"); 
sw.WriteLine("<config>"); 
for (int i = 0; i >=36; i++) 
{ 
    line = ""; 
    line = "<" + xmlnodes[i] + ">"; 
    line += vals[i]; 
    line += "</" + xmlnodes[i] + ">"; 
    sw.WriteLine(line); 
} 
sw.WriteLine("</config>"); 
sw.Close(); 
sw.Dispose();  

實施例2:(使用)

string line;  
using (sw = new StreamWriter("D:\\NewCon.xml")) 
{ 
    sw.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"); 
    sw.WriteLine("<config>"); 
    for (int i = 0; i >= 36; i++) 
    { 
     line = ""; 
     line = "<" + xmlnodes[i] + ">"; 
     line += vals[i]; 
     line += "</" + xmlnodes[i] + ">"; 
     sw.WriteLine(line); 
    } 
    sw.WriteLine("</config>"); 
} 

回答

11

使用(a){做一個東西}

這意味着當代碼塊用a完成時,程序將調用a.Dispose。你知道,即使發生異常,一個將會有Dispose調用。它基本上是這樣做的:

var a = IDisposable_Something; 
try{.....}finally{a.Dispose();} 

它更安全......不是真的,但那不是重點。關鍵是要確保在程序結束後儘快清理需要清理的資源。

所以你的第一個例子的問題是,如果沿線的某個地方拋出異常,它將不會使它成爲Dispose()方法。第二個意志。您總是希望確保Dispose被調用(如果它存在),因爲IDisposable類可能沒有被正確寫入,並且它沒有代碼來確保非託管資源被清理,即使沒有調用Dispose()(這通常在終結器中完成)。 LInk to Dispose Pattern.

我唯一見過在哪裏實現使用可能會比較棘手的是WCF服務代理(您可以解決該問題)。有一個錯誤,如果代理有時拋出一個異常,它會在Dispose()方法中導致另一個異常。

http://blogs.msdn.com/b/jjameson/archive/2010/03/18/avoiding-problems-with-the-using-statement-and-wcf-service-proxies.aspx

以外,你通常應該嘗試把一個IDisposable的對象在using語句。

+0

偉大的答案謝謝你爲我清理! – 2011-01-06 14:26:14

0

從某種意義上說,您更傾向於不忘記處理資源,尤其是在發生異常(您的代碼目前無法捕捉到)的情況下。

由於使用較少的代碼行並且代碼的意圖變得更加清晰,所以它更簡潔和習慣。

所以這樣的:如果一個異常是你的第一個例子則資源會不會被扔配置

using(StreamWriter sw = new StreamWriter("D:\\epkDATA\\NewCon.xml")) 
{ 
... 
} 
6

StreamWriter sw; 
try 
{ 
sw = new StreamWriter("D:\\epkDATA\\NewCon.xml"); 
... 
} 
finally 
{ 
sw.Dispose(); 
} 

相當於。

使用using可確保即使在引發異常時也能處理資源。

+0

在我點擊加載新答案之前,幾乎完全是我的答案框中的內容。 – Rangoric 2011-01-06 14:15:10

1

首先,例如1中的代碼應該被包裝在try /終於以與示例代碼功能上等同塊2

這麼說,我一直很喜歡「用」這樣的代碼塊。我認爲它通常會導致更易讀的代碼。就安全性或性能而言,在示例1和示例2之間你不會看到太大的區別,只要在第一個示例中使用try/finally塊即可!

0

使用using是安全的,因爲你已經guaranted使用(...)宣佈釋放資源牙套,即使任何錯誤或意外退出發生。

0

添加到以前的答案,而最importabt部分,如果發生異常,調用dispose()保證。

2

實例1不應該完成。如果拋出異常,您的電話將永遠不會發生,這可能是不好的。 using保證執行Dispose()。只有很好的替代例1(除了using)將是:

var iDisposableObject = new YourDisposableConstructor(); 
try 
{ 
    // some code 
} 
finally 
{ 
    iDisposableObject.Dispose(); 
} 
0

如果ClassA的從IDisposing.A繼承「使用」模式是等於以下內容:

IDisposable iDisposableObject = new YourDisposableConstructor(); 
try 
{ 
    // some code 
} 
finally 
{ 
    iDisposableObject.Dispose(); 
} 

所以我們最好用使用模式