【问题标题】:C# IDisposable Class, proper usage of Dispose, getting error 'dispose' takes 1 argumentC# IDisposable 类,正确使用 Dispose,获取错误“dispose”需要 1 个参数
【发布时间】:2012-04-19 17:16:15
【问题描述】:

下面是我正在使用的整个课程,我有两个问题,1 这是 Dispose() 的正确使用,还有,为什么我收到错误 No Overload for method 'dispose' requires 1 argument。

使用系统;
使用 System.Collections.Generic;
使用 System.Linq;
使用 System.Text;

命名空间爬虫
{
    类 LoggingClass : IDisposable
    {
        public void GenericLogging(string systemMsg, string SystemClass, string SystemSection, string ID, string FixID, string baseURL, string mysqlQueryName, string mysqlQuery)
        {
            字符串 Loggingall = " 插入 tblLogs " +
                            "set SystemMsg='" + systemMsg.Replace("'","''") + "'" +
                            ",SystemClass = '" + SystemClass.Replace("'", "''") + "'" +
                            ",SystemSection = '" + SystemSection.Replace("'", "''") + "'" +
                            ",ID = '" + CarID.Replace("'", "''") + "'" +
                            ",FixID = '" + FixID.Replace("'", "''") + "'" +
                            ",baseurl = '" + baseURL.Replace("'", "''") + "'" +
                            ",mysqlqueryName = '" + mysqlQuery.Replace("'", "''") + "'" +
                            ",mysqlquery = '" + mysqlQuery.Replace("'", "''") + "'" +
                            ",TimeStamp = Now()";
            MySQLProcessing.MySQLProcessor MYSQLP = new MySQLProcessing.MySQLProcessor();
            MYSQLP.MySQLInsertUpdate(Loggingall, "Loggingall");
        }

        公共无效处置()
        {
            处置(真);
            // 将自己从终结队列中移除
            // 防止该对象的终结代码
            // 从第二次执行。
            GC.SuppressFinalize(this);
        }
    }
}

这是我更新的代码: }

这是正确的调用方式吗?我还必须调用 dispose 吗?

【问题讨论】:

标签: c#


【解决方案1】:

不,这不是IDisposable 的正确用法,即因为您似乎实际上并没有处理任何东西。这也是您错误的原因;您已经取出了一些自动生成的代码。放回去(它看起来像这样)并跟随 cmets:

private bool disposed = false;

protected virtual void Dispose(bool disposing)
{
    if(!disposed) {
        disposed = true;

        if(disposing) {
            // Clean up managed resources, like files or GDI objects
        }

        // Clean up unmanaged resources, like COM components
    }
}

【讨论】:

    【解决方案2】:

    为什么我收到错误 No Overload for method 'dispose' 需要 1 个参数。

    因为您没有为 Dispose() 方法接受 bool 的重载。

    这是 Dispose() 的正确用法吗?

    很难说。您的类没有您显示的托管或非托管资源,因此该方法基本上什么都不做。 (实际上它调用GC.SuppressFinalize(this) 只会让事情变得更糟)

    【讨论】:

      【解决方案3】:

      正如其他回答者所提到的,您似乎不需要实现 IDisposable。你根本没有类字段,所以没有什么要清理的。

      假设该类的内容比您所展示的要多,那么您正在遵循实现 IDisposable 的模式,但您只完成了一半。

      该模式是让IDisposable.Dispose() 和终结器(~LoggingClass)都调用一个公共方法Dispose(bool)。在Dispose(bool) 方法中,如果布尔值为true,则应清理托管资源和非托管资源,如果传递false,则仅清理非托管资源。

      这是我用于实现 IDisposable 的代码。

      ~LoggingClass()
      {
          this.Dispose(false);
      }
      
      protected bool Disposed { get; private set; }
      
      public void Dispose()
      {
          this.Dispose(true);
          GC.SuppressFinalize(this);
      }
      
      protected virtual void Dispose(bool disposing)
      {
          if (!this.Disposed)
          {
              if (disposing)
              {
                  // Perform managed cleanup here.
      
              }
      
              // Perform unmanaged cleanup here.
      
              this.Disposed = true;
          }
      }
      

      编辑

      您似乎添加了更新后的代码,然后又将其删除。但是,这是我的 cmets 关于你如何称呼它的。

      使用您目前拥有的 GenericLogging 方法,您根本不需要 IDisposable。但是,我会做几件事来改进您的代码。

      1. 在 构造函数,而不是在 GenericLogging 方法中。
      2. 调用 MySQLProcessing.MySQLProcessor.Dispose()(或 .Close(),或 无论那个类有什么)在托管清理部分 处置(布尔)。
      3. 让您的 LoggingClass 对象保持更长时间。是的,你有什么 演示的是一个正确实现的using 语句,但你会 最终在您的代码中创建和销毁数千个对象。 创建一个 LoggingClass 对象,并在整个过程中保留它 程序的长度,而不仅仅是一条日志语句。
      4. 当您的应用程序即将退出时调用 LoggingClass.Dispose()。手动执行此操作(而不是使用 using 语句)。

      【讨论】:

      • 请注意:如果对象不拥有非托管资源,则不需要 ~LoggingClass() 覆盖。
      • @DavidYaw 这是我的整个班级,所以我想我完全遗漏了一些东西,使用上面的内容我将如何修改班级?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多