2011-04-07 28 views
2

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

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

回答

7

即使它具有相同的语法C++析构函数这个终结,其中,当对象被垃圾收集在定稿运行C# - 这会对性能产生影响,因为GC具有单独运行线程来运行所有终结器,要做到这一点你的对象实例将比需要更长的时间。

说了不应该使用它,如果你不是绝对必须的 - 例外是当你不得不处理资源,在这种情况下,你的班级也应该实施IDisposable。这将允许您的班级的消费者将其包装在using区块中,该区块将调用Dispose() - 这是您应该拆除资源的位置。

+2

你有什么建议呢? – ricki 2011-04-07 13:23:27

+0

以上不是意味着rudley btw :)你只是告诉我当时我该做什么。 – ricki 2011-04-07 13:31:20

+0

@ricki:理解 - 我添加到我的答案:实现'IDisposable'并在那里处理资源 - 在实例化类时使用'using'块,在终结器中调用Dispose()。如果可能,尽早删除临时文件夹,或使用系统临时文件夹 – BrokenGlass 2011-04-07 13:35:00

3

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

3

解构器(又名析构器或终结器)的问题是,你无法预测它们何时运行,因为它们被垃圾收集器调用。为了有一个可预测的行为,你应该实现IDisposable并调用Dispose明确(或使用该对象在using块)

您还可以在调用的情况下从Dispose析构函数它没有明确要求。请参阅this page以了解使用的推荐模式。

+0

+1进行使用 - 可能值得指出的是,正确实施IDisposable可能有点棘手,而一次性构件意味着包含的类需要是一次性的(这使得一次性构件有点像一次性的头痛) – 2011-04-07 13:29:30

2

我可能只是使用环境的临时文件/文件夹位置,以便用户或管理员可以将这些文件作为常规内务处理的一部分进行清理。

不要担心这样做,因为它有点黑客 - 是否真的那么重要,文件夹被删除,然后呢?

+0

是因为 - 对于特定的搜索,我只想要显示返回的pdf,如果我等待用户清理那么文件夹将填充旧内容和新 – ricki 2011-04-07 13:24:26

+0

你能清理文件夹_before_你搜索? – 2011-04-07 13:26:26

+0

是的,我想我可以这样做 - 这是有益的吗? – ricki 2011-04-07 13:28:55

2

避免执行尽可能完成最终。您无法控制何时被调用,并且它们会导致性能下降,因为运行时需要特别使用终结器处理对象。通常,如果您有本地对象句柄或需要清理的其他本地资源,则只应实现一个终结器。

取而代之,在您的类上实现IDisposable接口,将清理代码移至Dispose方法,并确保您的所有客户都调用Dispose方法(using语句对此很有用)。

2

实现IDisposable接口istead:

public class tester : IDisposable 
{ 
    #region IDisposable Members 

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

    #endregion 
} 

using (tester t = new tester()) 
{ 

} 
//tester now disposed 

但是不要忘记this gem of knowledge from MSDN

因为Dispose方法必须 显式调用,对象是 实现IDisposable还必须 实施终结器处理 释放资源时Dispose不是 调用

因此,您还应该实现您的终结器以及您的IDisposable接口,同时铭记都将被调用。

+0

但是这里的“释放资源”是指本地资源,就像打开文件之类的句柄一样,不是吗?像文件系统中的文件这样的外部性,在你的代码中没有打开,在这种情况下不适用作为“资源”。 – 2011-04-07 13:58:58

+0

术语“资源”有点不清楚。资源不是一件“事情” - 这是一项责任,只有某个特定的对象具有信息和推动力才能执行。在程序退出前应该删除的文件的创建是这样的责任;虽然,由于各种因素可能会导致此类操作失败或被任意长时间封锁,因此我会对删除Finalize方法中的文件(C#令人恼火地称为“析构函数”)有点持怀疑态度。还要注意,终结器有时会在它们预期之前运行,造成麻烦。 – supercat 2011-04-11 22:21:40

1

为什么不使用IDisposable的inteface代替,然后就可以用“使用”和最多需要执行的Dispose()将执行所有的干净包装您的通话

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

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