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

时间:2012-04-05 23:42:52

标签: c#

下面是我正在使用的全班,我有两个问题,1这是Dispose()的正确使用,还有,为什么我得到错误No Overload for method'dispose'需要1个参数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Crawler
{
    class LoggingClass : IDisposable
    {
        public void GenericLogging(string systemMsg, string SystemClass, string SystemSection, string ID, string FixID, string baseURL, string mysqlQueryName, string mysqlQuery)
        {
            string Loggingall = " insert into 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");
        }

        public void Dispose()
        {
            Dispose(true);
            // Take yourself off the Finalization queue 
            // to prevent finalization code for this object
            // from executing a second time.
            GC.SuppressFinalize(this);
        }
    }
}

这是我更新的代码:                                     }

这是调用它的正确方法吗?我是否还必须致电处理?

3 个答案:

答案 0 :(得分:4)

正如其他回答者所提到的,看起来你不需要实现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;
    }
}

修改

看起来您添加了更新的代码,然后将其删除。但是,这是我对你如何称呼它的评论。

使用当前拥有的GenericLogging方法,您根本不需要IDisposable。但是,我会做一些改进代码的事情。

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

答案 1 :(得分:0)

不,这不是IDisposable的正确用法,因为你似乎并没有真正处置任何东西。这也是导致错误的原因;你已经取出了一些自动生成的代码。把它放回去(它看起来像这样)并按照评论:

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 :(得分:-1)

  

为什么我收到错误没有重载方法'dispose'需要1个参数。

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

  

这是正确使用Dispose()还是

很难说。您的类没有显示的托管或非托管资源,因此该方法基本上不执行任何操作。 (实际上它会调用GC.SuppressFinalize(this),这会让事情变得更糟)