連接將被自動管理。但是,(或者至少可以像評論所建議的那樣)與DataContext關聯的其他資源。直到DataContext被垃圾收集器銷燬後,這些資源纔會被釋放。因此,確保在不再需要DataContext時調用dispose通常會更好。
using (ProjDataContext db = new ProjDataContext()) {
bool hasPassword = (from p in db.tblSpecUser
where p.UserID == userId
select p.HasPassword).FirstOrDefault();
return hasPassword;
}
這確保了db.Dispose()
是當使用塊退出,從而關閉所述連接顯式調用。
編輯:繼我看着DataContext的討論出售自己(也使用反射),發現下面的代碼(FW 3.5),它會從DataContext.Dispose
稱爲:
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (this.provider != null)
{
this.provider.Dispose();
this.provider = null;
}
this.services = null;
this.tables = null;
this.loadOptions = null;
}
}
所以有是這被釋放的資源:
- 其可以持有
DbConnection
的供應商,一個LO g(TextWriter
)和DbTransaction
。
- 該
CommonDataServices
。
- 表字典。
LoadOptions
。
供應商可能持有需要處理的資源(DbConnection
和DbTransaction
)。根據用戶已經分配給DataContext
的記錄機制的例如TextWriter
,日誌的TextWriter
也可能必須被丟棄。一個FileWriter然後自動關閉。
就我所瞭解的其他屬性而言,沒有過多考慮細節,只有內存,但這也可用於通過dispose方法進行垃圾回收,但是,在內存實際上獲得釋放。
所以,最後我完全casparOne的說法:
一般來說,共享數據訪問的資源,如這是一個壞主意。
您應該創建資源來訪問數據庫,執行操作,然後在完成後處理它們。
哇,感謝您的快速回復!我將替換所有我的projdatacontext代碼以使用'using'方法,而不是創建新實例並等待其調用的Dispose方法。再次感謝您的幫助。 – 2010-02-28 19:21:24
值得注意的是,雖然IDisposable在Linq to SQL中實現,但Linq to SQL的設計者明確指出DataContext在大多數情況下不需要處理**。請參閱http://stackoverflow.com/questions/821574/c-linq-to-sql-should-datacontext-be-disposed-using-idisposable/821595 – 2010-02-28 19:32:36
感謝您的信息。如果我理解正確,這是否意味着雖然'使用'適用於需要對GC時序進行更嚴格控制的情況,但是在使用DataContext時(大部分時間)並不需要這麼做嗎? – 2010-02-28 19:57:04