2011-04-07 32 views
0

我有使用SqlDataAdapter是否需要處理無法填充的DataTable?

// ... 
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command)) 
    try 
    { 
     dataAdapter.Fill(dataTable); 
    } 
    catch 
    { 
     dataTable.Dispose(); 
     dataTable = null; 
    } 

現在,我不喜歡貨物邪教編程填補了DataTable的功能,所以我寧願沒有try - catch塊,如果它是不必要的。是否需要Dispose a DataTable未能填滿?

+0

你的問題與問題的標題有什麼關係? – 2011-04-07 16:50:31

+0

@馬克乙:對不起,我不小心從另一個問題上覆制了標題。以防萬一,我喜歡打開幾個StackOverflow問題頁面。 – pyon 2011-04-07 16:52:58

+1

偉大的貨物崇拜大聲敲門。 DataTable不實現Dispose()。沒有意義,它只是一包字節。它從MarshalByValueComponent繼承它。當你使用數據設計器,即「組件」部分時,它只會做一些半有趣的事(不是真的)。如果你沒有,那麼Dispose()就什麼也不做。當然,我無法將其作爲答案發布。 – 2011-04-07 17:07:14

回答

1

不,不需要調用Dispose。這樣做將不會釋放已用於該對象的內存,並且即使您不撥打Dispose,GC也會在稍後時間檢索它。你可以閱讀更多關於這個here

+0

真棒回答!如果MSDN文檔包含此信息將會很好。 – pyon 2011-04-07 16:58:42

1

由於try塊未能在對象上調用Dispose是沒有必要的

1

如果代碼創建一個特定明確具體類型的對象,它被記錄爲實現IDisposable.Dispose作爲無糖op,那麼可以安全地做,而無需直接或間接調用Dispose。如果Dispose確實沒有做任何事情,那麼處置或不處理都不會影響任何內容。另一方面,如果你的代碼使用類似工廠方法的東西來創建一個實現IDisposable的可繼承類型的對象,或者如果你的代碼被賦予了這樣一個對象的所有權,那麼你應該處理它。即使你希望得到一個不需要Dispose的類的對象,也沒有辦法確定你的類不會接受一個需要Dispose的派生類型。請注意,通常,將實現IDispsoable.Dispose的類調用Dispose作爲no-op將非常快;對於可能需要或可能不需要IDisposable的類來實現Dispose作爲no-op,並且使類調用的用戶無條件地Dispose,而不是要求類的用戶測試對象是否爲IDisposable,以及Dispose如果是的話。