2012-07-25 44 views
0

我的問題是關於IDisposable的實現。據我所知,當代碼或部分完成時,變量或實例被處置;如果陳述錯誤,請糾正我。後續是我計劃的一部分:IDispose是必要的,垃圾收集器是否工作在循環結束等

If Con.State = ConnectionState.Closed Then Con.Open() 
     Cmd = New SqlCeCommand("Select * from BillItem", Con) 
     Rdr = Cmd.ExecuteReader() 
     While Rdr.Read = True 
      Dim x As New Classes.StockRoster 
      x.BillID = Rdr("BillID") 
      x.IsSales = Rdr("IsSales") 
      x.Quantity = Rdr("Quantity") 
      x.ContactBase = (From t As CommonCodes.ItemBase In ContactsbaseDict Where t.ID = BillContactDict(x.BillID)).First 
      x.StockEntityBase = StockEntitydict(Rdr("StockID")) 
      x.BillDate = Rdr("BillDate") 
      result.AddRange(x) 
     End While 
     Con.Close() 
End IF 

在X變量的情況下,在這裏,會不會有任何改善記憶,如果我X(或StockRoster)將使用IDisposable接口?

在每個循環結束時默認情況下資源是否會被處置?

回答

1

IDisposable是關於處置非託管資源,如數據庫連接。它與垃圾收集沒有任何關係。

您的StockRoster類似乎不佔用非託管資源,因此它不需要執行IDisposable。即使這樣做,將它置於for循環中也沒有意義,因爲您將該實例添加到稍後使用的結果列表中。將它放在for循環中會導致實例在調用代碼中不可用。

+0

感謝您的信息。 – surpavan 2012-07-25 20:41:29

1

首先,如果連接處於打開狀態,您將永遠不會輸入If-clause f.e.在有例外的情況下。

其實連接就是最好的例子。請務必儘快關閉連接。最簡單的方法是使用using-statement,最後調用Dispose(即使在例外的情況下)。所以它類似於Try/Catch/FinallyConnection.Dispose也會隱式關閉它。

作爲一條經驗法則:使用using-statement來實現IDisposable(如上面的SqlCeCommand)。

要回答你的問題實際:

會有任何改善記憶,如果我X(或StockRoster)將 使用IDispose類,無法將資源獲取在每個循環的結束 默認配置?

什麼是改善記憶IDisposable是一個接口,你可以調用處理,甚至上課的時候沒有實現IDisposable接近。這只是一個暗示,它可能使用非託管資源,應儘快處理。

+0

感謝您的信息。 – surpavan 2012-07-25 20:40:56