Dispose()或Finalize()是否应该用于删除临时文件?

Eri*_*tas 19 .net c# idisposable temporary-files

我有一个类,Path.GetTempFileName()它在活动时使用临时文件().我想确保在程序关闭后这些文件不会留在用户的硬盘驱动器上占用空间.现在我的类有一个Close()方法,它检查该类使用的任何临时文件是否仍然存在并删除它们.

将此代码放在Dispose()或Finalize()方法中会更有意义吗?

sta*_*tar 44

更好的是用FileOptions.DeleteOnClose创建文件.这将确保操作系统在您的进程退出时强制删除文件(即使在粗暴中止的情况下).当然,你完成后仍然需要自己关闭/删除文件,但这提供了一个很好的支持,以确保你不允许文件永远存在

  • 示例:`using(FileStream fs = File.Create(Path.GetTempFileName(),Int16.MaxValue,FileOptions.DeleteOnClose)){//使用临时文件} //此处将删除文件 (6认同)

Eri*_*ert 12

我会两个都做; 让这个级别一次性,并让终结器清理它.安全有效地采用标准模式:使用它而不是试图自己推断出正确的模式是什么.这很容易出错.仔细阅读:

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

请注意,在编写终结器时,您必须非常小心.当终结器运行时,您的许多正常假设都是错误的:

  • 竞争条件或死锁有各种各样的潜力,因为你不再在主线程上,你在终结者线程上.

  • 在常规代码中,如果您在对象内部运行代码,那么您就知道对象引用的所有内容都是活动的.在终结器中,对象引用的所有内容可能刚刚完成!死对象的终结器可以按任何顺序运行,包括在"父"对象之前完成的"子"对象.

  • 在常规代码中,将对象的引用分配给静态字段可能是完全合理的.在终结器中,您分配的引用可能是已经死亡的对象,因此赋值会使死对象恢复生命.(因为静态字段引用的对象总是存活的.)这是一种非常奇怪的状态,如果你这样做,就不会发生任何令人愉快的事情.

  • 等等.小心.如果你编写一个非平凡的终结器,你应该完全理解垃圾收集器的操作.


Ale*_*rey 6

文件是非托管资源,您实现IDisposable以清理您的类所依赖的非托管资源.

我已经实现了类似的类,尽管从未在生产代码中.

但是,我理解你对此的暂时性 - 用户与应用程序之外的文件进行交互可能会搞砸事情并在处理过程中造成问题.但是,对于应用程序创建/删除的任何文件,这都是相同的,无论它是否通过Dispose()方法进行整理.

我不得不说实施IDisposable是一个合理的选择.