1

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

使用系统;
使用 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);
        }
    }
}

这是我更新的代码:}

这是正确的称呼方式吗?我也必须调用处置吗?

4

3 回答 3

6

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

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

模式是 toIDisposable.Dispose()和 finalizer ( ~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. 在 Dispose(bool) 的托管清理部分调用 MySQLProcessing.MySQLProcessor.Dispose()(或 .Close(),或任何该类具有的)。
  3. 让您的 LoggingClass 对象保持更长时间。是的,您所演示的是一个正确实现的using语句,但您最终会在代码中创建和销毁数千个对象。创建一个 LoggingClass 对象,并在程序的整个长度内保留它,而不仅仅是一条日志语句。
  4. 当您的应用程序即将退出时调用 LoggingClass.Dispose()。手动执行此操作(而不是使用using语句)。
于 2012-04-05T23:51:44.400 回答
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
    }
}
于 2012-04-05T23:48:10.953 回答
-1

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

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

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

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

于 2012-04-05T23:48:27.663 回答