2013-10-08 16 views
1

爲什麼ReSharper的警告我下面的代碼示例中「獲得處置關閉」:這裏「進入處置關閉」是什麼意思?

using (SqlCommand command = new SqlCommand()) 
{ 
    command.Parameters.Add("@temp", SqlDbType.VarChar); 
    Action<string> action = str => 
     { 
      command.Parameters["@temp"].Value = string.Empty; 
     }; 
} 

我不使用代理外using聲明...如何解決這一問題?

回答

1

您在action引用command,你可以在別的地方使用action然後usingreference到佈置command

Resharper告訴你,你可以訪問處置關閉,因爲使用using以外的操作會導致這種情況。避免使用這樣的一次性物品,當然它會扔NullReferenceException,但它可能很難找到真正的問題。

+4

告訴我,如果我錯了,但不會拋出一個'ObjectDisposedException'而不是一個NRE? – knittl

+0

最有可能是ODE .. –

5

此代碼:

Action<string> action = str => 
{ 
    command.Parameters["@temp"].Value = string.Empty; 
}; 

限定了委託變量動作使用命令。委託是一個方法定義,可以作爲變量傳遞並在別處調用,使用 action.Invoke()命令是一次性封閉。

Resharper標記這個的原因是因爲這段代碼並不直接表明這個委託會在什麼時間點被調用。原則上,在處置命令後,代表的定義將在(並且將被調用)周圍。

Resharper 8.1是本文寫作的最新版本,無法確定此代理是否真的無法從別處調用。