C# IDisposable 类,正确使用 Dispose,获取错误“dispose”需要 1 个参数

Posted

技术标签:

【中文标题】C# IDisposable 类,正确使用 Dispose,获取错误“dispose”需要 1 个参数【英文标题】:C# IDisposable Class, proper usage of Dispose, getting error 'dispose' takes 1 argument 【发布时间】: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 吗?

【问题讨论】:

这门课还有比你在这里展示的更多内容吗?该类根本不需要实现IDisposable 类似:***.com/q/9472304/1026459 【参考方案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。但是,我会做几件事来改进您的代码。

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

【讨论】:

请注意:如果对象不拥有非托管资源,则不需要 ~LoggingClass() 覆盖。 @DavidYaw 这是我的整个班级,所以我想我完全遗漏了一些东西,使用上面的内容我将如何修改班级?

以上是关于C# IDisposable 类,正确使用 Dispose,获取错误“dispose”需要 1 个参数的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中实现 IDisposable [重复]

C#中对IDisposable接口的理解

从组件派生并正确实现 IDisposable

C#中IDisposable的用法

c# 中最简单的 IDisposable 模式是啥? [复制]

使用 IDisposable 模式在 C# 中同步对资源的访问的方法