我在C#winforms应用程序中有这个代码:
SqlDataReader reader = dataObject.EjecutarConsulta();
try
{
//Some stuff
}
finally
{
reader.Close();
reader.Dispose();
}
现在,在代码分析中,我收到Do not dispose objects multiple times
消息。为什么是这样?我必须说,在try
区块之间,我不会关闭或处置任何东西。
答案 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()方法。