问题标签 [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.
c# - 在.net 析构函数中重新创建对“this”的根引用是否合法?
在 .net 中编写以下内容是否合法?
它按预期工作并向控制台写入'0',但我想知道它是否保证始终工作。
有人知道幕后发生了什么吗?
c# - C# 析构函数(又名:终结器)所涉及的成本?
析构函数应该只释放你的对象持有的非托管资源,它不应该引用其他对象。如果您只有托管引用,则不需要(也不应该)实现析构函数。您只希望它用于处理非托管资源。因为有一个析构函数需要一些成本,所以你应该只在消耗有价值的、非托管资源的方法上实现它。
本文没有对此进行更深入的讨论,但是在 C# 中使用析构函数会涉及哪些成本?
注意:我知道 GC 和析构函数在可靠时间没有被调用的事实,除此之外,还有什么其他的吗?
c# - 应该在没有终结器的对象上调用 GC.SuppressFinalize 吗?
出于某种原因,FXCop 似乎认为我应该在 Dispose 中调用 GC.SuppressFinalize,无论我是否有终结器。
我错过了什么吗?是否有理由对未定义终结器的对象调用 GC.SuppressFinalize?
c# - .NET - 终结器和退出 (0)
我有一个 .NET C# / C++ 应用程序,它在线程中使用对exit(0)
(from <stdlib.h>
) 的调用来终止。
奇怪的是,在某些情况下,托管对象的终结器在调用之后立即被调用exit
,而在其他情况下,它们根本不会被调用。
情况非常确定 - 应用程序在其生命周期内从外部插件 dll(用非托管 C 编写)调用一些方法。
如果我使用 dll A,则始终调用终结器。
如果我使用 dll B,则永远不会调用终结器。
在 exit(0) 调用的情况下,终结器的预期行为是什么?(如果有任何预期的 - 和记录的 - 行为)
对外部 dll 的调用能否更改一些可能影响进程终止方式的全局设置?
.net - 配置字体有多重要,真的吗?
我知道最好的做法是在任何实现 IDisposable 的对象上调用 Dispose,尤其是包装有限资源(如文件句柄、套接字、GDI 句柄等)的对象。
但是我遇到了一个情况,我有一个有字体的对象,我必须通过几层对象来探测 IDisposable,并查看很多用法,以确保我总是处理字体。我想知道它是否值得复杂。
如果 Font 包装了 HFONT,那将是一回事,因为 GDI 资源是系统全局的。但是 Font 不包装 GDI 句柄;它是 GDI+,它是一个完全独立的系统,据我所知,它是本地进程,而不是像 GDI 那样的系统全局。与 Image 不同,Font 永远不会占用文件系统资源(无论如何我都知道)。
所以我的问题是:让字体收集垃圾的真正成本是多少?
我知道我会对终结者造成一点打击,但如果“泄漏”字体的数量很少(比如六个),那么老实说,这种打击不会引起注意。除了终结器之外,这似乎与分配一个中等大小的数组并让 GC 清理它没有太大区别——它只是内存。
让字体获得 GCed 是否有我不知道的成本?
c# - 终结者有什么用?
我已经在 .NET 中编程了四年(主要是 C#),并且我广泛使用 IDiposable,但我还没有发现需要终结器。终结者有什么用?
asp.net - 处置和完成属性集合?
我正在查看我刚刚继承的一些 vb.net 代码,但无法理解为什么原始开发人员会这样做。
基本上,每个“域”类都是属性的集合。并且每一个都实现了 IDisposable.Dispose,并覆盖了 Finalize()。没有基类,所以每个都只是扩展对象。
Dispose 将每个私有 var 设置为 Nothing,或在属性是另一个域对象时调用 _private.Dispose。有一个私有 var 可以跟踪处置状态,而 Dispose 中的最后一件事是 GC.suppressFinalize(Me)
Finalize 只调用 Me.Dispose 和 MyBase.Finalize。
这有什么好处吗?有什么害处吗?没有非托管资源,没有数据库连接,似乎不需要这个。
.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 会为我解决问题,即:
最后,我实现了一个宏来处理这个问题:
c# - 在 C# 中使用 Finalize/Dispose 方法
C# 2008
我已经为此工作了一段时间,但我仍然对在代码中使用 finalize 和 dispose 方法感到困惑。我的问题如下:
我知道在处理非托管资源时我们只需要一个终结器。但是,如果有托管资源调用非托管资源,是否还需要实现终结器?
但是,如果我开发一个不直接或间接使用任何非托管资源的类,我是否应该实现
IDisposable
允许该类的客户端使用“使用语句”?实现 IDisposable 只是为了让你的类的客户使用 using 语句是否可行?
/li>我在下面开发了这个简单的代码来演示 Finalize/dispose 的使用:
/li>
关于源代码的问题:
这里我没有添加终结器,通常终结器会被GC调用,终结器会调用Dispose。由于我没有终结器,我什么时候调用 Dispose 方法?是必须调用它的类的客户端吗?
因此,我在示例中的类称为 NoGateway,客户端可以像这样使用和处置该类:
执行到 using 块的末尾时会自动调用 Dispose 方法,还是客户端必须手动调用 dispose 方法?IE
/li>我在
WebClient
课堂上使用该NoGateway
课程。因为WebClient
实现了IDisposable
接口,这是否意味着WebClient
间接使用了非托管资源?是否有严格的规则来遵循这一点?我怎么知道一个类使用了非托管资源?
java - 完成期间对对象的引用
如果在 finalize 调用期间保存对当前对象的引用会发生什么?例如:
对象是否被垃圾收集?当您稍后尝试访问时会发生什么bar.REFERENCE
?