我已经多次看到开发人员使用内联一次性对象,here例如。内联我的意思是:
var result = new DataTable().Compute("1 + 4 * 7", null);
我知道 Dispose
方法不会被调用,但由于没有引用对象,垃圾收集器将如何处理它?使用这样的一次性元素安全吗?
我在示例中使用了 DataTable
,因为它是我找到的唯一具体示例,但我的问题通常适用于一次性对象。我个人并没有那样使用它们,我只是想知道如果以这种方式使用它们,GC 是否会对其进行不同的处理。
最佳答案
这里的关键问题是调用 Dispose
的时间,这在您的示例中是未知的(提供了 IDisposable
的良好实现——见下文)。我会考虑使用没有 using
语句的 IDisposable
实例代码味道。该类正在实现 IDisposable
是有原因的,因此您作为用户应该遵守它的契约(Contract)。
但是,请注意在 correct implementation 中IDisposable
类的终结器处理未处置对象的处置。因此,即使未在using
中实例化,也应执行处置,但时间未知且在不同的(GC 的)线程上。
I just wanted to know if they are handled diffently by the GC if they are used that way.
不,GC 对待所有对象都是一样的,并且不会以任何方式区别对待 IDisposable
实现。但是,在 IDisposable
的正确实现中,Finalize
方法(由 GC 在每个对象上调用,除非在每个对象的基础上被抑制)调用将导致调用 处置
。
关于c# - 内联创建和使用一次性对象是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36816475/