我见过很多次开发人员使用一次性对象内联,here。内联我的意思是:
var result = new DataTable().Compute("1 + 4 * 7", null);
我知道Dispose
方法不会被调用,但由于没有对该对象进行引用,垃圾收集器将如何处理它?使用像这样的一次性物品是否安全?
我在我的例子中使用了DataTable
,因为它是我找到的唯一具体例子,但我的问题一般适用于一次性物品。我不会亲自使用它们,我只是想知道如果它们以这种方式使用它们,它们是否会被不同的处理。
答案 0 :(得分:11)
这里的关键问题是调用Dispose
的时间,这在您的示例中是未知的(提供IDisposable
的良好实现 - 见下文)。我会考虑使用IDisposable
实例,而不是using
语句代码味道。由于某种原因,该类正在实施IDisposable
,因此您作为用户应遵守其合同。
但请注意,在IDisposable
using
{class}}类中,终结器处理未处置对象的处理。因此,即使在IDisposable
中不实例化,也应该在未知的时间和不同的(GC的)线程中执行处理。
我只是想知道如果以这种方式使用它们,它们是否会被不同的处理。
不,GC会对所有对象进行处理,并且不会以任何方式处理IDisposable
实现。但是,正确实现Finalize
Dispose
方法(由GC在每个对象上调用,除非基于每个对象进行抑制)调用将导致调用{{1}}。
答案 1 :(得分:1)
如果正在初始化内联的对象实现了析构函数,那么析构函数可能在对象超出范围后调用Dispose()。
但是,更简洁和正确的方法是使用using语句,因为这可能会导致只有实例的对象挂起而没有任何意义。
答案 2 :(得分:1)
以这种方式使用一次性物品是不安全的。是的,不会引用任何引用,但Disposable模式的目的是处置所有不能被垃圾收集的非托管资源(如OS句柄)。