首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在线创建和使用一次性对象安全吗?

在线创建和使用一次性对象安全吗?
EN

Stack Overflow用户
提问于 2016-04-23 21:11:41
回答 3查看 783关注 0票数 17

我曾多次看到开发人员在内联中使用一次性对象,例如这里。我所说的内联是指:

代码语言:javascript
复制
var result = new DataTable().Compute("1 + 4 * 7", null);

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

我在示例中使用了DataTable,因为它是我找到的唯一具体示例,但我的问题一般适用于一次性对象。我个人并不是那样使用它们的,我只是想知道如果它们是这样使用的话,GC是否会对它们进行不同的处理。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-23 21:18:03

这里的关键问题是何时调用Dispose,这在您的示例中是未知的(提供了一个很好的IDisposable实现--参见下面)。我会考虑使用没有IDisposable语句的using实例,代码气味。类实现IDisposable是有原因的,因此您作为用户应该遵守它的约定。

但是,请注意,在正确实施 of IDisposable中,类‘’es终结器处理未释放对象的处理。因此,即使没有在using中实例化,也应该在未知的时间和不同的(GC)线程上执行处理。

我只想知道它们是否被GC不同地处理,如果它们是这样使用的。

不,GC对待所有对象都一样,对IDisposable实现没有任何不同的对待。但是,在IDisposable的正确实现中,Finalize方法(在每个对象上由GC调用,除非在每个对象的基础上被抑制)调用将导致调用Dispose

票数 11
EN

Stack Overflow用户

发布于 2016-04-23 21:17:25

如果正在内联初始化的对象具有已实现的析构函数,则该析构函数可能在对象超出作用域后调用that ()。

但是,更简洁和正确的方法是使用using语句,因为这可能只会导致对象在没有用途的情况下挂起。

票数 1
EN

Stack Overflow用户

发布于 2016-04-23 21:18:00

以这种方式使用一次性物品是不安全的。是的,不会保留引用,但是Disposable模式的目的是释放所有不能被垃圾收集的非托管资源(如OS句柄)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36816475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档