完成 C# 中的方法指南和最佳做法

本文关键字:最佳 方法 完成 | 更新日期: 2023-09-27 18:34:11

我最近遇到了一个与在 Finalize 方法重载中运行的代码相关的问题。

我主要知道与内存管理/性能相关的问题,但我感兴趣的是否有任何关于"哪些代码应该/不应该进入 Finalize 方法"的准则?

例如:

  1. 不要从 Finalize 方法中引发异常。
  2. 代码应快速执行。
  3. 不要引发事件 (?
  4. 等。。。

在我的案例中,由于引发了导致某些异常的事件,因此看到了这种行为。

所以我的问题是 - 关于最终确定方法,我必须遵循哪些准则(甚至可能使用某些工具强制执行(?

完成 C# 中的方法指南和最佳做法

定稿仅用于摆脱非托管资源

来自 MSDN

如果 Finalize 或

Finalize 的覆盖引发异常,并且运行时不是由覆盖默认策略的应用程序托管的,则运行时将终止进程,并且不会执行任何活动的 try-finally 块或终结器。此行为可确保终结器无法释放或销毁资源时的进程完整性。

完成操作具有以下限制:

终结器在垃圾回收期间执行的确切时间是不确定的。不保证在任何特定时间释放资源,除非调用 Close 方法或 Dispose 方法。

两个对象的终结器不保证以任何特定顺序运行,即使一个对象引用另一个对象也是如此。也就是说,如果对象 A 具有对对象 B 的引用,并且两者都具有终结器,则当对象 A 的终结器启动时,对象 B 可能已经完成。

未指定运行终结器的线程

你应该没有理由调用 finalize。尽管你可以重写它,但使用 finalize 的最佳做法是不要使用它们。而是从 IDisoposable 继承。这不仅是最佳实践,而且不会干扰垃圾回收,并且具有方便的"using"子句来自动处置。 继承此类还向其他开发人员指出,这是一个具有要处置的资源的对象,我是一种特殊的方式。

我什至认为 GC 会在垃圾运行期间调用 disout。

简而言之,你可以做的任何事情都可以通过 Finalize 完成,最好用 dispose 来完成。