首先 - 在您的示例中,您使用的接口是IDisposable
,與GC完全無關。從本質上講,你的代碼編譯成這樣:
SqlConnection cn = null;
try
{
cn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
cn.Open();
// Set all previous settings to inactive
using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 0", cn))
{
cmd.ExecuteNonQuery();
}
cn.Close();
}
finally
{
if (cn != null)
cn.Dispose();
}
由於cn.Dispose()
和cn.Close()
在這種情況下是相同的 - 是的,後者是多餘的。
現在,如果你想談論GC,那麼你會寫這樣的:
SqlCOnnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
cn.Open();
// Set all previous settings to inactive
using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 0", cn))
{
cmd.ExecuteNonQuery();
}
cn = null; // Or just leave scope without doing anything else with cn.
在這種情況下,它會採取GC關閉打開的連接,並將其返回到池中。在這種情況下,這意味着你無法預測何時發生。實際上,這個代碼會(很有可能)泄漏SqlConnections,很快你會用完它們(你會得到一個TimeoutException,因爲池中沒有可用的連接)。
所以,是的,你上面的例子是正確的方法。無論何時使用實現IDisposable
的某個對象,將其包裝在using
塊中。你不需要打擾.Close()
,雖然它也沒有傷害。我個人不寫。更少的代碼,更少的混亂。
由於您使用'using'語句,'cn.Close()'完全是多餘的。在您的示例中爲 – 2010-08-23 09:03:14
,它是IDispose/using()誰清除連接,而不是GC。控制連接和文件等資源的生命週期是很好的(基本)練習。 GC應該僅用於內存資源。 – tenfour 2010-08-23 09:08:32