内联创建和使用一次性对象是否安全?

时间:2016-04-23 21:11:42

标签: c#

我见过很多次开发人员使用一次性对象内联,here。内联我的意思是:

var result = new DataTable().Compute("1 + 4 * 7", null);

我知道Dispose方法不会被调用,但由于没有对该对象进行引用,垃圾收集器将如何处理它?使用像这样的一次性物品是否安全?

我在我的例子中使用了DataTable,因为它是我找到的唯一具体例子,但我的问题一般适用于一次性物品。我不会亲自使用它们,我只是想知道如果它们以这种方式使用它们,它们是否会被不同的处理。

3 个答案:

答案 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句柄)。