问题标签 [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 投票
2 回答
397 浏览

c# - Finalizers with Dispose() in C#

See the code sample from MSDN: (http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=VS.100).aspx)

In the Dispose() implementation it calls GC.SupressFinalize();, but provide a destructor to finalise the object.

What is the point of providing an implementation for the destructor when GC.SuppressFinalize() is called?

Just little bit confused what the intentions are?

0 投票
6 回答
3048 浏览

java - finalize() 方法的良好使用

这主要是出于好奇。

除了调试/日志记录/分析目的之外,如果有人遇到过 Object.finalize() 的任何好的用法,我一直在徘徊?

如果您还没有遇到任何问题,您会说什么是好的用法?

0 投票
3 回答
300 浏览

c# - 使用析构函数/终结器昂贵吗?

我正忙着对非确定性破坏感到困惑。在对另一个问题的回答中,我得到的建议是析构函数/终结器(我认为在 c# 中是相同的东西,即名为 ~classname() 的函数)很昂贵且不需要。但是看看这个例子,使用了一个析构函数,从评论中听起来它可能是至关重要的。任何人都对这一切如何组合在一起有一些建议,我应该从我的代码中删除析构函数吗?

再次感谢。

0 投票
2 回答
4608 浏览

c# - C++/CLI:防止对非托管资源的托管包装进行垃圾收集

我有一个NativeDog需要从 C# 使用的 C++ 非托管类,所以我创建了一个包装类ManagedDog

一切都很好,我使用这样的类:

看看有什么问题?一开始我也没有,直到非常奇怪的事情开始不时发生。基本上,如果在调用MyFunc()程序后被 GC 暂停,而它在本机函数中的某个位置FeedDogNative(上面标记(***)),它会认为托管包装器可以被收集,因为它不再被使用,在 C# MyFunc 中(它是一个本地变量并且不会在FeedDogManaged调用后使用),在FeedDogManaged. 所以这实际上偶尔会发生。GC 调用 Finalizer,它delete是本机 dog 对象,即使FeedDogNative它还没有使用完!所以我的非托管代码现在正在使用已删除的指针。

我怎样才能防止这种情况?我可以想到一些方法(例如,假装dog在末尾使用的虚拟调用FeedDogManaged)但是推荐的方法是什么?

0 投票
5 回答
5574 浏览

c# - 正确实现 Finalize 和 Dispose 的方法(当父类实现 IDisposable 时)

我在我的类中实现了 Finalize 和 Dispose,我在我的父类上实现了 IDisposable 并在我的子类中覆盖了 Dispose(bool) 重载。我不确定

  1. 是否使用重复的 isDisposed 变量(因为它已经存在于基类中)?
  2. 是否也在子类中实现终结器?

这两件事都在此处给出的示例中完成-

http://guides.brucejmack.biz/CodeRules/FxCop/Docs/Rules/Usage/DisposeMethodsShouldCallBaseClassDispose.html

而这篇 MSDN 文章中的示例没有这两个中的任何一个 - http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx

而 MSDN 中的这个例子并不完整 - http://msdn.microsoft.com/en-us/library/ms182330.aspx

0 投票
2 回答
482 浏览

.net - 我应该在 IDisposable AND Finalize 上实施 GC.SupressFinalize 吗?

我的新客户处的代码审查清单具有以下内容 -

实现 Dispose 和 Finalize 的类应该在 Dispose 实现中调用 GC.SupressFinalize

为什么?

它不应该读作实现 IDisposable 接口的类应该在 Dispose 实现中调用 GC.SupressFinalize 吗?

还是我错过了一些愚蠢的东西?

0 投票
3 回答
3601 浏览

c# - C#中关于Dispose()和析构函数的两个问题

我有一个关于如何使用Dispose()和析构函数的问题。阅读一些文章和 MSDN文档,这似乎是推荐的实现Dispose()和析构函数的方式。

但是我有两个关于这个实现的问题,你可以在下面阅读:

GC.SupressFinalize(this) on Dispose()

当程序员using显式使用或调用 Dispose() 时,我们的类正在调用GC.SupressFinalize(this). 我的问题是:

  • 这究竟意味着什么?是否会收集对象但不调用析构函数?我想答案是肯定的,因为框架将析构函数转换为 Finalize() 调用,但我不确定。

在没有 Dispose() 调用的情况下完成

假设 GC 将要清理我们的对象但程序员没有调用Dispose()

  • 我们为什么不在此时处置资源?换句话说,为什么我们不能在析构函数上释放资源?
  • if里面必须执行什么代码,外面又是什么?

    /li>

提前致谢

0 投票
3 回答
643 浏览

c# - 我可以检测一个对象是否调用了 GC.SuppressFinalize?

有没有办法检测一个对象是否调用了 GC.SuppressFinalize?

我有一个看起来像这样的对象(为清楚起见,省略了完整的 Dispose 模式):

如果ownsResource构造函数参数是false,那么终结器将无事可做——因此GC.SuppressFinalize从构造函数直接调用似乎是合理的(如果有点古怪)。然而,因为这种行为很古怪,我很想在 XML 文档注释中记录它……如果我想评论它,那么我应该为它编写一个单元测试。

但是,虽然System.GC具有设置对象可终结性的方法(SuppressFinalizeReRegisterForFinalize),但我看不到任何获取对象可终结性的方法。有没有办法查询 GC.SuppressFinalize 是否已在给定实例上被调用,而不是购买 Typemock 或编写我自己的 CLR 主机?

0 投票
3 回答
988 浏览

c# - 带析构函数的 IDisposable:需要线程安全的实现?

这几乎只是为了确保我做对了:

我们有一个实现 IDisposal 模式的大型资源类。它应该(通过设计)以某种方式实现,使其能够被多次调用(即使我们尝试准确地调用它一次)。我们还实现了一个终结器,它也调用 Dispose() 方法 - 就像备份一样。如果手动调用,Dispose() 也会调用 GC.SuppressFinalize(this)。

周围有几个处置模式的例子。他们中的大多数人在处理代码的末尾调用 GC.SuppressFinalize(this) 。有人声称,最好在 Dispose() 方法的开头调用它,然后再进行任何清理。后者争辩说,这将确保 GC 不会同时调用终结器,而我们仍在清理。

问题:
似乎将 GC.SuppressFinalize 放在开头并没有更好的效果?我们还有比赛条件,对吧?那么,我们宁愿以线程安全的方式实现 Dispose() 是真的吗?

0 投票
2 回答
840 浏览

c# - 如果从不调用终结器的性能惩罚

我有一个带有终结器的课程。但由于我一直在调用Dispose()并且Dispose()正在调用GC.SupressFinalize(this),我认为我的对象实际上从未进入终结队列。终结器只是在那里作为后盾,以防该类的另一个用户忘记调用Dispose().

即使从未调用终结器并且对象从未进入终结队列,仅实现终结器是否有任何性能损失?

我以前不这么认为,但是在 Bill Wagner 的Effective C#: Second Edition的第 102 页上,它说:“即使它从未被调用,终结器的存在确实会给你的类型带来相当大的性能损失。”