如何在类上正确使用dispose方法

Cje*_*en1 1 c# windowsformshost

我正在研究一个数据库,我需要在数据库类被破坏时将数据库写入文件以及表单关闭时的其他数据库

这就是我目前的称呼方式:

class database: IDisposable
{
    List<databaseEntry> dDatabase;

    public database()
    {
        dDatabase = new List<databaseEntry>;
    }
    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
             StreamWriter sw = new StreamWriter(path);

             string toWrite;

             foreach (databaseEntry dE in dDatabase)
             {
             toWrite = dE.rfid.ToString() + " " + dE.currentArea.ToString() + " " + dE.itemName;
             sw.WriteLine(toWrite);
             }

             sw.Close();
             disposed = true;
         }
     }//destructor for database (saves database to file)

     public void Dispose()
     {
          Dispose(true);
          GC.SuppressFinalize(this);
     }
 }
Run Code Online (Sandbox Code Playgroud)

当我关闭打开此类的窗体时,不会调用Dispose方法.

这是一个赋值,我不允许使用SQL.

Jur*_*eri 5

您无法控制Dispose垃圾收集器何时调用该方法.如果要在窗体关闭时处置资源,则应Dispose在窗体关闭时手动调用该方法.

这是通过监听表单的FormClosed事件来实现的.

所以你会做类似的事情:

  1. 创建此方法:

    private void Form1_FormClosed(Object sender, FormClosedEventArgs e)
    {
        if(this.database != null)
            this.database.Dispose(); 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将此行放在表单的构造函数中:

    this.FormClosed += Form1_FormClosed;
    
    Run Code Online (Sandbox Code Playgroud)

由于您正在实现IDisposable,另一种解决方案是将数据库对象实例化包装在using语句中 - 这将Dispose在using语句中的代码完成后自动调用.

您的用例语法如下:

using(database db = new database())
{
    //use your db object
} //db is disposed here
Run Code Online (Sandbox Code Playgroud)