2013-11-27 37 views
3

我是一位開發人員,他正在維護並不斷更快更好地製作應用程序。我碰到一段使用.Dispose()的代碼,它位於using聲明中。多次處置對象

下面是代碼:

using (IDbCommand cmd = proxy.Connection.CreateCommand()) 
{ 
    cmd.CommandText = "usp_GetPluginInfo"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add(proxy.Connection.CreateParameter(cmd, "@dealershipId", dealershipId)); 
    cmd.Parameters.Add(proxy.Connection.CreateParameter(cmd, "@pluginId", pluginId)); 
    PluginInfo[] pluginInfos = PopulatePluginsFromCommand(cmd); 
    result = pluginInfos.First(); 
    cmd.Dispose(); 
} 

豈不最後}處置當命令完成?在這種情況下,我認爲沒有必要使用Dispose()

非常感謝您的幫助!

+0

重複的問題:是不是多餘的在自己的內部使用塊處理對象?](http://stackoverflow.com/questions/10683086/isnt-it-redundant-to-dispose-of-an-object-inside-its-own-using-block ) – Logarr

+0

你是對的。 – EkoostikMartin

回答

6

你是對的,沒有必要。 一個using聲明是由編譯器翻譯成這樣:

IDbCommand cmd = proxy.Connection.CreateCommand(); 

try 
{  
    //... 
} 
finally 
{ 
    if(cmd != null) 
     ((IDisposable)cmd).Dispose(); 
} 

說了這麼多,叫Dispose不止一次不應是「傷害」或者,作爲一個適當的IDisposable的實現應該是冪等。然而,這是多餘的,你應該刪除它,因爲你正在清理代碼。

+0

幾乎是正確的,這個任務在嘗試之外。如果賦值拋出異常,則沒有理由處置。 – EkoostikMartin

+0

@EkoostikMartin我已經解決了這個問題:P我還將顯式轉換添加到'IDisposable'中,以防'IDbCommand'明確實現Dispose。 – dcastro

+0

儘管要小心考慮''一個正確的IDisposable實現''。不恰當的實現可能會在處置處置資源時出現問題。 – Servy

0

using聲明總是調用IDisposable.Dispose()方法。 cmb.Dispose()代碼是冗餘的

0

使用調用在塊的退出時進行配置,無論塊是成功運行還是發生異常。在你的例子中,對Dispose的顯式調用是多餘的。

1

你是對的!該using塊是以下語法糖:

IDbCommand cmd = proxy.Connection.CreateCommand(); 
try 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add(proxy.Connection.CreateParameter(cmd, "@dealershipId", dealershipId)); 
    cmd.Parameters.Add(proxy.Connection.CreateParameter(cmd, "@pluginId", pluginId)); 
    PluginInfo[] pluginInfos = PopulatePluginsFromCommand(cmd); 
    result = pluginInfos.First();} 
finally 
{ 
    if(cmd != null) 
    { 
     ((IDisposable)cmd).Dispose(); 
    } 
} 

所以,是的,額外的cmd.Dispose();是不必要的。在大多數情況下,一個寫作良好的班級不會做第二個.Dispose()(使用所謂的Disposable Pattern),但有時會導致問題。擺脫它!

0

一個他可以明確地把它放在那裏的原因。如果IDbCommand不是System.Data中的一個,並且由於某種原因而創建的接口繼承自IDisposable,但使用的是new而不是override,則它們可能具有不同的行爲。但它絕對是多餘的99.999999999%。

+0

'IDbCommand'是'interface System.Data.IDbCommand' – Turp

+0

@Turp我知道,我在理論上。 –

0

這是多餘的,並且不保證明確呼叫Dispose執行。如果你想明確地調用Dispose,請確保在finally塊中執行此操作。