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

标签 c#

我已经多次看到开发人员使用内联一次性对象,here例如。内联我的意思是:

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

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

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

最佳答案

这里的关键问题是调用 Dispose 的时间,这在您的示例中是未知的(提供了 IDisposable 的良好实现——见下文)。我会考虑使用没有 using 语句的 IDisposable 实例代码味道。该类正在实现 IDisposable 是有原因的,因此您作为用户应该遵守它的契约(Contract)。

但是,请注意在 correct implementationIDisposable 类的终结器处理未处置对象的处置。因此,即使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/

相关文章:

c# - 访问成员表达式的值

c# - 使用 OleDb 写入 Excel

c# - var item 在针对 null 进行测试时抛出异常

c# - 爬虫/机器人如何工作?区分机器人/爬虫 http 请求

c# - 在 C# 中查询 MSMQ 系统队列

c# - javascript ASP.NET hiddenfield 从后面的代码中获取值

c# - 将 TDelegate 作为事件的通用接口(interface)?

c# - 在 Visual Studio 中增加构建修订号

c# - ASP.NET 核心 2.1。 MVC View 中的 Razor UI 类库

C# Flag 获取组合标志的值