2

我有一些文件写入 c# 中的临时位置。然后将它们呈现为 pdf 缩略图。当对象被销毁时,我希望清理该位置,那么在这种情况下可以使用解构函数吗?

    ~Foo()
    {
        try
        {
            Directory.Delete(path, true);
        }
        catch (IOException ex)
        {
            Console.WriteLine("exception: " + ex.Message + " . from: Foo_Closing");
        }
4

8 回答 8

7

尽管它具有与 C++ 析构函数相同的语法,但它是 C# 中的终结器,当对象在终结时被垃圾收集时运行 - 这将产生性能影响,因为 GC 必须运行单独的线程来运行所有终结器,以执行此操作您的对象实例将比必要的寿命更长。

话虽如此,如果您不是绝对必须使用它,则不应使用它——一个例外是当您必须处理资源时,在这种情况下您的类也应该实现IDisposable. 这将允许您的类的消费者将其包装在一个using块中,该块将调用Dispose()- 这是您应该拆除资源的地方。

于 2011-04-07T13:20:55.283 回答
3

您应该实现 IDisposable 接口,并在那里进行清理。

于 2011-04-07T13:22:13.863 回答
3

解构器(也称为析构器或终结器)的问题在于您无法预测它们何时运行,因为它们是由垃圾收集器调用的。为了具有可预测的行为,您应该显式实现IDisposable和调用Dispose(或在using块中使用对象)

Dispose如果没有显式调用,您也可以从析构函数调用。有关推荐使用的模式,请参阅此页面。

于 2011-04-07T13:22:33.297 回答
2

我可能只是使用环境的临时文件/文件夹位置,以便用户或管理员可以在正常的内务处理过程中清理文件。

不要打扰这样做,因为它带有黑客的味道 - 然后在那里删除文件夹真的那么重要吗?

于 2011-04-07T13:22:40.153 回答
2

尽可能避免实现终结器。您无法控制它们何时被调用,并且它们会导致性能损失,因为运行时需要特别处理具有终结器的对象。通常,只有当您有本机对象句柄或其他需要清理的本机资源时,您才应该实现终结器。

相反,在您的类上实现 IDisposable 接口,将您的清理代码移动到 Dispose 方法,并确保您的所有客户端都调用 Dispose 方法(该using语句对于此目的很方便)。

于 2011-04-07T13:23:35.483 回答
2

而是实现 IDisposable 接口:

public class tester : IDisposable
{
    #region IDisposable Members

    public void Dispose()
    {
        //cleanup code here
    }

    #endregion
}

using (tester t = new tester())
{

}
//tester now disposed 

但不要忘记来自 MSDN 的知识宝典

因为必须显式调用 Dispose 方法,所以实现 IDisposable 的对象还必须实现终结器以在未调用 Dispose 时处理释放资源

因此,您还应该实现终结器以及 IDisposable 接口,记住两者都会被调用。

于 2011-04-07T13:23:36.783 回答
1

为什么不使用 IDisposable 接口,然后你可以用“使用”来包装你的调用,Dispose() 将执行它需要执行的所有清理

public class Foo : IDisposable { public void Dispose() { //Clean up here}
}

using (foo = new Foo() ) { //consume foo here }

于 2011-04-07T13:24:46.510 回答
0

有一个选项可以在关闭时删除临时文件,如果您能够利用它没关系,对吗?试试这些链接

  1. 处理临时文件流
  2. http://msdn.microsoft.com/en-us/library/system.io.fileoptions.aspx
  3. http://www.codeproject.com/KB/system/Taking_care_of_temp_files.aspx?msg=3489384
于 2011-04-07T13:29:32.113 回答