2012-12-14 30 views
2

可能重複:
Trying to understand the ‘using’ statement better使用使用處置資源

我真的閱讀所有其他職位,但沒有人真正回答我的問題。

這是我的函數返回一個表

 public DataTable ReturnTable() 
     { 
      DataTable dt = new DataTable(); 
      using (SqlConnection con = new SqlConnection(mainConnectionString)) 
      { 
       con.Open();        
       using (SqlCommand cmd = new SqlCommand()) 
       { 
        cmd.CommandType = CommandType.Text;  
        SQL = " SELECT * from table";       
        cmd.CommandText = SQL;            
        using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
        { 
         da.Fill(dt); 
        } 
       } 
      }   
      return dt; 
     } 

什麼是以前的優勢,針對以下(即我總是用之前發現「使用」的一個):

public DataTable ReturnTable() 
      { 
       DataTable dt = new DataTable(); 
       SqlConnection con = new SqlConnection(mainConnectionString); 
       con.Open();        
       SqlCommand cmd = new SqlCommand(); 
       cmd.CommandType = CommandType.Text;  
       SQL = " SELECT * from table";       
       cmd.CommandText = SQL;            
       SqlDataAdapter da = new SqlDataAdapter(cmd); 
       da.Fill(dt); 
       con.Close(); 
       return dt; 
      } 

第二,是不是CON,CMD和DA妥善處理? 第二個有什麼問題嗎?

謝謝!

+0

因爲它擁有物理數據庫資源,所以連接對象是關閉或處理最重要的對象。直到GC在第二種情況下確定對象時纔會關閉,如果有異常。處理命令和數據適配器是一個非常好的主意,但並不重要。 –

回答

0

的優點是using模式調用IDisposable接口上的Dispose()方法,保證你可能已經錯過了任何清理邏輯被正確執行,即使有異常拋出。

在實踐中,實施IDisposable對象持有到該得到清理時Dispose()被稱爲非託管資源。所以撥打Close()可能是不夠的。

4

第二個有什麼不對嗎?

只要你沒有得到你的代碼的異常,這將工作以同樣的方式爲con,因爲Close()Dispose()在這種情況下實際上是相同的。它不會立即處置dacmd,並且會一直等到它們被垃圾收集以釋放資源。

using的優勢在於,即使在出現異常或提前退出該方法的情況下(即在方法中間添加return),您的資源仍會處理。

0

不,他們是不是一樣。這就是整個using

如果您的代碼引發異常,會發生什麼情況?這些對象不會被丟棄,直到垃圾收集器碰巧遇到它。

0

在這種情況下,「using」用於嘗試實現RAII模式,這在處理有限資源(如數據庫連接)時特別有用。