有没有一种安全的方法在析构函数中使用托管字段?

时间:2012-10-15 13:21:53

标签: c# .net file destructor managed

我有一个类在构造函数中创建一个隐藏文件,并保持其FileStream打开,直到调用Dispose()。调用Dispose()会关闭流并删除隐藏文件。

如果在没有调用Dispose()的情况下关闭程序,我需要确保删除该文件。我以为我可以检查它是否仍然存在并调用File.Delete(path)如果它在析构函数中执行但是在调用析构函数时已经可以收集保存文件路径的字符串字段,对吗?

是否有一种从析构函数访问该字段的安全方法?
如果没有,我还有另一种方法可以确保删除该文件吗?

3 个答案:

答案 0 :(得分:2)

  

但是在调用析构函数时,已经可以收集保存文件路径的字符串字段,对吗?

没有。该字符串仍然存在且可以安全使用。

但你必须仔细操作,如果文件仍然打开,请先关闭文件。

  

我需要确保在没有调用Dispose()的情况下关闭程序时删除文件

这是一项重大挑战。这里保证不多。确保客户端代码始终调用Dispose()。

答案 1 :(得分:1)

我相信您可以简单地覆盖您正在使用的类的Finalize()方法。根据{{​​3}}:

  

析构函数隐式调用对象基类的Finalize。因此,先前的析构函数代码被隐式转换为以下代码:

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

使用Finalize()方法时,您还可以确保尚未“收集”任何字段,因此您可以安全地使用所有对象的字段。

答案 2 :(得分:0)

如果您的进程崩溃或被终止,则不会调用Dispose()方法。你应该测试某个文件是否被其他进程锁定,而不是在文件存在的情况下休息