我曾多次看到开发人员在内联中使用一次性对象,例如这里。我所说的内联是指:
var result = new DataTable().Compute("1 + 4 * 7", null);我知道不会调用Dispose方法,但是由于没有对对象的引用,垃圾收集器将如何处理它?使用这样的一次性物品安全吗?
我在示例中使用了DataTable,因为它是我找到的唯一具体示例,但我的问题一般适用于一次性对象。我个人并不是那样使用它们的,我只是想知道如果它们是这样使用的话,GC是否会对它们进行不同的处理。
发布于 2016-04-23 21:18:03
这里的关键问题是何时调用Dispose,这在您的示例中是未知的(提供了一个很好的IDisposable实现--参见下面)。我会考虑使用没有IDisposable语句的using实例,代码气味。类实现IDisposable是有原因的,因此您作为用户应该遵守它的约定。
但是,请注意,在正确实施 of IDisposable中,类‘’es终结器处理未释放对象的处理。因此,即使没有在using中实例化,也应该在未知的时间和不同的(GC)线程上执行处理。
我只想知道它们是否被GC不同地处理,如果它们是这样使用的。
不,GC对待所有对象都一样,对IDisposable实现没有任何不同的对待。但是,在IDisposable的正确实现中,Finalize方法(在每个对象上由GC调用,除非在每个对象的基础上被抑制)调用将导致调用Dispose。
发布于 2016-04-23 21:17:25
如果正在内联初始化的对象具有已实现的析构函数,则该析构函数可能在对象超出作用域后调用that ()。
但是,更简洁和正确的方法是使用using语句,因为这可能只会导致对象在没有用途的情况下挂起。
发布于 2016-04-23 21:18:00
以这种方式使用一次性物品是不安全的。是的,不会保留引用,但是Disposable模式的目的是释放所有不能被垃圾收集的非托管资源(如OS句柄)。
https://stackoverflow.com/questions/36816475
复制相似问题