使用SqlDataReader在代码分析中显示消息“不要多次放置对象”

时间:2014-05-20 20:55:40

标签: c# code-analysis

我在C#winforms应用程序中有这个代码:

SqlDataReader reader = dataObject.EjecutarConsulta();
try
{
   //Some stuff
}
finally
{
   reader.Close();
   reader.Dispose();
}

现在,在代码分析中,我收到Do not dispose objects multiple times消息。为什么是这样?我必须说,在try区块之间,我不会关闭或处置任何东西。

2 个答案:

答案 0 :(得分:3)

DbDataReader.Dispose()内部调用DbDataReader.Close()

public void Dispose()
{
    this.Dispose(true);
}

protected virtual void Dispose(bool disposing)
{
    if (disposing)        
        this.Close();        
}

所以,用

reader.Close();
reader.Dispose();

你将读者连续两次置于处置状态。

UPDATE:CA2202警告描述说明,Close()可以被视为Dispose()等价物:

  

方法实现包含可能导致多个的代码路径   调用IDisposable.Dispose或Dispose等效项,例如   某些类型的Close()方法,在同一个对象上。

这就是您看到多个 dispose 警告的原因。

答案 1 :(得分:0)

为什么不这样做:

using(SqlDataReader reader = dataObject.EjecutarConsulta()){
    try
{
   //Code Goes Here
   }
}catch(Exception ex){
Messagebox.Show(ex.toString());
}

通过使用using语句,它确保对象已被正确处理掉,我确信你听到了; .Close()方法处理对象,因此不需要.Dispose()方法。