2012-07-03 39 views
1

所以我接管了一個現有的項目,以前的編碼器做了很多有趣的事情。可以在finally塊中處理數據集並返回數據集嗎?

我看到的最而沒有真正理解是代碼

finally 
{ 
    if (conn != null) 
    { 
     conn.Close(); 
     ds.Dispose(); 
    } 
} 
return ds; 

VS2010不抱怨以下塊,該項目按預期工作,但是這是對的bizzare我。

如何處理並返回?除非終於在返回後發生?!

如果有人能解釋爲什麼這是合法的?或任何其他解釋將不勝感激。

+0

他是否進一步處置conn,因此conn == null? – ChrisBint

+0

你應該通過這個線程http://stackoverflow.com/questions/2940629/this-dispose-dont-release-memory-used-by-form-after-closing-it – Habib

回答

3

它不正確的處理ds之前從method回來,因爲你將失去數據集中的信息。 在finally塊中放置連接看起來完全正常,但不是必須返回到調用方法的數據集 ds。

0

一樣,它似乎在DS當它返回配置,它給你任何錯誤,當您運行的代碼,如果是重構代碼,並//發表意見ds.Dispose

+1

我猜編碼器是困惑,他想通過處置conn – JohnnBlade

1

你都應該.Dispose()對象,當你不再需要它們時。很明顯,在你將這個DataSet放到這個例子中後你需要DataSet,所以你絕對不應該在這裏處理它。

。DataSet上的Dispose()實際上可能不會做任何事情,這就是爲什麼代碼似乎可以工作。請記住,.Dispose()意味着關閉並最終確定垃圾收集器無法執行的資源的使用情況,或者爲了立即丟棄這些資源,而不是垃圾收集器啓動的時間。 但是,您不應該依賴.Dispose( )在DataSet上沒有做任何事情 - 可能會有情況發生。修復代碼。

0

當您調用Dispose()函數時,您只是標記要垃圾回收的對象,而不是立即「釋放/銷燬」該對象。這就是代碼工作的原因。如果這種邏輯沒有任何意義,你總是可以做這樣的事情:

try{ 
    // ... your code 
    return ds; 
} 
catch(Exception x) 
{ 
    // ... Exception code 
} 
finally 
{ 
    if (conn != null) 
    { 
     conn.Close(); 
     ds.Dispose(); 
    } 
}