【问题标题】:Message "Do not dispose objects multiple times" in Code Analysis with SqlDataReader使用 SqlDataReader 进行代码分析中的消息“不要多次处理对象”
【发布时间】:2014-07-09 07:17:56
【问题描述】:

我的 C# winforms 应用程序中有这段代码:

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

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

【问题讨论】:

  • 有理由不使用 using 语句吗?
  • 我正在考虑使用该语句(使用),但我想知道为什么要给出此消息。
  • 你已经成为迷信处置模式的牺牲品。您多次关闭对象。

标签: c# code-analysis


【解决方案1】:

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

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

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

所以,与

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

您连续两次将阅读器置于已处置状态。

更新:CA2202 警告描述指出,Close() 可以被视为 Dispose() 等效项:

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

这就是为什么您会看到多个 dispose 警告。

【讨论】:

  • 我明白.. 所以我不应该调用 Close 方法,但这条消息是关于 Dispose multiple times no Closing multiple times
  • 为什么是两次?你说Dispose 内部调用Close...所以,我调用Close 两次.. 不Dispose.. 我不明白..
  • 所以当代码分析说Do not Dispose 可能是DisposeClose?...现在我明白了:)
  • @Phoenix_uy 更新答案 - 在这种情况下,Close 被视为 Dispose 的等效项
  • @Phoenix_uy 是的,完全正确 :) 我认为您会看到流的相同行为。顺便说一句,考虑使用using 语句而不是手动编写try catch Dispose
【解决方案2】:

为什么不这样做:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2014-04-10
    • 2013-08-11
    相关资源
    最近更新 更多