问题标签 [finalizer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
220 浏览

c# - 在.net 析构函数中重新创建对“this”的根引用是否合法?

在 .net 中编写以下内容是否合法?

它按预期工作并向控制台写入'0',但我想知道它是否保证始终工作。

有人知道幕后发生了什么吗?

0 投票
4 回答
1212 浏览

c# - C# 析构函数(又名:终结器)所涉及的成本?

析构函数应该只释放你的对象持有的非托管资源,它不应该引用其他对象。如果您只有托管引用,则不需要(也不应该)实现析构函数。您只希望它用于处理非托管资源。因为有一个析构函数需要一些成本,所以你应该只在消耗有价值的、非托管资源的方法上实现它。

-- C++ 程序员的 C# 十大陷阱

本文没有对此进行更深入的讨论,但是在 C# 中使用析构函数会涉及哪些成本?

注意:我知道 GC 和析构函数在可靠时间没有被调用的事实,除此之外,还有什么其他的吗?

0 投票
5 回答
3572 浏览

c# - 应该在没有终结器的对象上调用 GC.SuppressFinalize 吗?

出于某种原因,FXCop 似乎认为我应该在 Dispose 中调用 GC.SuppressFinalize,无论我是否有终结器。

我错过了什么吗?是否有理由对未定义终结器的对象调用 GC.SuppressFinalize?

0 投票
4 回答
2094 浏览

c# - .NET - 终结器和退出 (0)

我有一个 .NET C# / C++ 应用程序,它在线程中使用对exit(0)(from <stdlib.h>) 的调用来终止。

奇怪的是,在某些情况下,托管对象的终结器在调用之后立即被调用exit,而在其他情况下,它们根本不会被调用。

情况非常确定 - 应用程序在其生命周期内从外部插件 dll(用非托管 C 编写)调用一些方法。
如果我使用 dll A,则始终调用终结器。
如果我使用 dll B,则永远不会调用终结器。

在 exit(0) 调用的情况下,终结器的预期行为是什么?(如果有任何预期的 - 和记录的 - 行为)

对外部 dll 的调用能否更改一些可能影响进程终止方式的全局设置?

0 投票
6 回答
6272 浏览

.net - 配置字体有多重要,真的吗?

我知道最好的做法是在任何实现 IDisposable 的对象上调用 Dispose,尤其是包装有限资源(如文件句柄、套接字、GDI 句柄等)的对象。

但是我遇到了一个情况,我有一个有字体的对象,我必须通过几层对象来探测 IDisposable,并查看很多用法,以确保我总是处理字体。我想知道它是否值得复杂。

如果 Font 包装了 HFONT,那将是一回事,因为 GDI 资源是系统全局的。但是 Font 不包装 GDI 句柄;它是 GDI+,它是一个完全独立的系统,据我所知,它是本地进程,而不是像 GDI 那样的系统全局。与 Image 不同,Font 永远不会占用文件系统资源(无论如何我都知道)。

所以我的问题是:让字体收集垃圾的真正成本是多少?

我知道我会对终结者造成一点打击,但如果“泄漏”字体的数量很少(比如六个),那么老实说,这种打击不会引起注意。除了终结器之外,这似乎与分配一个中等大小的数组并让 GC 清理它没有太大区别——它只是内存。

让字体获得 GCed 是否有我不知道的成本?

0 投票
5 回答
2708 浏览

c# - 终结者有什么用?

我已经在 .NET 中编程了四年(主要是 C#),并且我广泛使用 IDiposable,但我还没有发现需要终结器。终结者有什么用?

0 投票
4 回答
272 浏览

asp.net - 处置和完成属性集合?

我正在查看我刚刚继承的一些 vb.net 代码,但无法理解为什么原始开发人员会这样做。

基本上,每个“域”类都是属性的集合。并且每一个都实现了 IDisposable.Dispose,并覆盖了 Finalize()。没有基类,所以每个都只是扩展对象。

Dispose 将每个私有 var 设置为 Nothing,或在属性是另一个域对象时调用 _private.Dispose。有一个私有 var 可以跟踪处置状态,而 Dispose 中的最后一件事是 GC.suppressFinalize(Me)

Finalize 只调用 Me.Dispose 和 MyBase.Finalize。

这有什么好处吗?有什么害处吗?没有非托管资源,没有数据库连接,似乎不需要这个。

0 投票
1 回答
939 浏览

.net - 在 C++/CLI 场景中调用 GC::KeepAlive 的便捷方式?

我正在使用 C++/CLI 编写一些托管包装器。问题是 GC 有时会在我使用它的非托管成员时处理该对象。(我认为这种行为很疯狂,但这是另一个话题)。有关更多详细信息,请参阅:

终结器在其对象仍在使用时启动 http://blogs.msdn.com/cbrumme/archive/2003/04/19/51365.aspx

我正在寻找的是一种方便的调用方式:

在每个方法的最后。对于普通的旧 void 方法,它很容易,但对于返回值的方法,它有点棘手。

必须变成:

这对我来说有点难看。

我考虑了一个在 dtor 中调用 GC::KeepAlive 的保护类,但这会在每个方法中引发 ctor 和 dtor 调用,这似乎有点过分。

是否有任何可用的 C++ 魔法可以让我避免使用临时变量?

编辑

我意识到 try + finally 会为我解决问题,即:

最后,我实现了一个宏来处理这个问题:

0 投票
13 回答
198127 浏览

c# - 在 C# 中使用 Finalize/Dispose 方法

C# 2008

我已经为此工作了一段时间,但我仍然对在代码中使用 finalize 和 dispose 方法感到困惑。我的问题如下:

  1. 我知道在处理非托管资源时我们只需要一个终结器。但是,如果有托管资源调用非托管资源,是否还需要实现终结器?

  2. 但是,如果我开发一个不直接或间接使用任何非托管资源的类,我是否应该实现IDisposable允许该类的客户端使用“使用语句”?

    实现 IDisposable 只是为了让你的类的客户使用 using 语句是否可行?

    /li>
  3. 我在下面开发了这个简单的代码来演示 Finalize/dispose 的使用:

    /li>

关于源代码的问题:

  1. 这里我没有添加终结器,通常终结器会被GC调用,终结器会调用Dispose。由于我没有终结器,我什么时候调用 Dispose 方法?是必须调用它的类的客户端吗?

    因此,我在示例中的类称为 NoGateway,客户端可以像这样使用和处置该类:

    执行到 using 块的末尾时会自动调用 Dispose 方法,还是客户端必须手动调用 dispose 方法?IE

    /li>
  2. 我在WebClient课堂上使用该NoGateway课程。因为WebClient实现了IDisposable接口,这是否意味着WebClient间接使用了非托管资源?是否有严格的规则来遵循这一点?我怎么知道一个类使用了非托管资源?

0 投票
5 回答
3696 浏览

java - 完成期间对对象的引用

如果在 finalize 调用期间保存对当前对象的引用会发生什么?例如:

对象是否被垃圾收集?当您稍后尝试访问时会发生什么bar.REFERENCE