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 个参数的主要内容,如果未能解决你的问题,请参考以下文章