finalizer相关内容

在 C# 中使用 Finalize/Dispose 方法

C# 2008 我已经为此工作了一段时间,但我仍然对在代码中使用 finalize 和 dispose 方法感到困惑.我的问题如下: 我知道在处理非托管资源时我们只需要一个终结器.但是,如果有托管资源调用非托管资源,是否还需要实现终结器? 但是,如果我开发一个不直接或间接使用任何非托管资源的类,我是否应该实现 IDisposable 以允许该类的客户端使用“使用陈述'? 实 ..
发布时间:2022-01-31 15:34:32 C#/.NET

正确清理 WPF 用户控件

我对 WPF 比较陌生,它的一些东西对我来说很陌生.一方面,与 Windows 窗体不同,WPF 控件层次结构不支持 IDisposable.在 Windows 窗体中,如果用户控件使用任何托管资源,则通过重写每个控件实现的 Dispose 方法来清理资源非常容易. 在 WPF 中,事情并没有那么简单.找了好几个小时,遇到了两个基本的主题: 第一个主题是 Microsoft 明确指出 ..
发布时间:2022-01-22 19:05:04 其他开发

为什么总是需要在具有 IDisposable 成员的对象上实现 IDisposable?

据我所知,如果你有一个类 A 有一个成员 m 是 IDisposable,A 应该实现 IDisposable 并且它应该在其中调用 m.Dispose() 是一个公认的规则. 我找不到令人满意的理由. 我理解如果你有非托管资源,你应该提供一个终结器以及 IDisposable 的规则,这样如果用户没有显式调用 Dispose,终结器仍然会在 GC 期间清理. 但是,有了该规则, ..
发布时间:2022-01-16 10:28:20 C#/.NET

c#终结器抛出异常?

引用自 MSDN: 如果 Finalize 或 Finalize 的覆盖引发异常,则运行时会忽略该异常,终止该 Finalize 方法,并继续终结过程. 如果我有: ~Person(){抛出新异常(“meh");} 那么它会导致运行时异常吗? 附言我知道这永远不会发生,但是我只是对这种行为感到好奇.我们的一个客户在他们所有的终结器周围都有一个空的 try catch.它甚至没 ..
发布时间:2022-01-16 10:26:48 C#/.NET

C# WeakReference 对象在终结器中为 NULL,但仍被强引用

您好,我这里有代码,但我不明白为什么会遇到断点(请参阅评论). 这是我不知道或我不正确理解的 Microsoft 错误吗? 代码在 Debug 中经过测试,但我认为它不应该改变任何东西. 注意:您可以直接在控制台应用程序中测试代码. 仅供参考...在 supercat 回答之后,我用建议的解决方案修复了我的代码,它运行良好:-) !!!坏事是静态字典的使用以及随之而来的性能 ..
发布时间:2022-01-16 10:26:13 C#/.NET

在 Java 中如何将对象标记为 finalized(以便第二次不会调用 finalize 方法)?

主要问题在主题中,但让我展示一下我对 Java 中完成过程的看法,以便我可以问你更多问题. gc 通过标记所有活动对象开始垃圾收集.当所有可达对象都被标记为“活动"时.所有其他对象都无法访问.下一步是检查每个无法到达的对象,并确定它是否可以立即被清扫,或者应该首先完成.如果对象的 finalize 方法有一个主体,那么 gc 会考虑下一个方法,那么这个对象是可终结的并且应该被终结;如果对象的 ..
发布时间:2022-01-16 10:19:57 Java开发

在 Go 中哪些对象是默认完成的,它有哪些陷阱?

函数runtime.SetFinalizer(x, f interface{}) 将与 x 关联的终结器设置为 f. 什么类型的对象默认被终结? 默认完成这些对象会导致哪些意外陷阱? 解决方案 默认完成以下对象: os.File:文件对象被垃圾回收时自动关闭. os.Process:最终确定将释放与进程相关的任何资源.在 Unix 上,这是一个无操作.在 Windo ..
发布时间:2022-01-16 10:04:28 其他开发

使用 Object Initializer 的复活区别

我有这个代码: 本质上,我是在尝试演示 c# 终结器的使用并制作一个不会死的对象,我称它为 Zombie.现在,通常这个演示效果很好,但今天我尝试使用与对象初始化程序相同的代码,而不是仅仅分配给属性(在这种情况下为名称).我注意到有区别.也就是说,终结器永远不会被调用,即使我正在尽我最大的努力让垃圾收集器完成它的工作. 谁能解释一下区别,或者我在 C# 编译器中发现了一个错误? ..
发布时间:2022-01-16 09:58:14 C#/.NET

垃圾收集和终结器:更精细的点

在回答关于 SO 的另一个问题* 以及随后的评论讨论时,我遇到了一个我不清楚的问题. 在我误入歧途的任何地方纠正我...... 当垃圾收集器收集一个对象时,它会在单独的线程上调用该对象的终结器(除非终结器已被抑制,例如通过 Dispose() 方法).收集时,GC 会挂起除触发收集的线程之外的所有线程(后台收集除外). 不清楚的地方: 垃圾收集器在收集之前是否等待终结器对该 ..
发布时间:2022-01-16 09:54:18 C#/.NET

在 Java 中替换 finalize()

Object.finalize() 在 Java 9 中已被弃用,我想我明白其中的原因,但我很难看到如何替换它. 我有一个名为 Configuration 的实用程序类,它本质上只有一个实例,它拥有应用程序中的所有内容并在应用程序期间持续存在.它提供的服务之一是记录:在第一次请求记录消息时,会创建一个记录器(由于各种遗留原因,它是我自己的记录器而不是标准记录器),并在配置对象的字段中保存一个 ..
发布时间:2022-01-16 09:54:01 Java开发

应该“处置"仅用于包含非托管资源的类型?

我最近和一位同事讨论了 Dispose 的值和实现 IDisposable 的类型. 我认为为应该尽快清理的类型实现 IDisposable 是有价值的,即使没有要清理的非托管资源. 我的同事想法不同;如果您没有任何非托管资源,则无需实施 IDisposable,因为您的类型最终会被垃圾回收. 我的论点是,如果您有一个想要尽快关闭的 ADO.NET 连接,那么实现 IDispos ..
发布时间:2022-01-16 09:53:46 C#/.NET

终结器和 IDisposable

基于文档(MSDN:链接),很明显,在实现终结器时应该使用 IDisposable 模式. 但是,如果您实现了 IDisposable(以便提供一种确定性的对象处置方式),并且您没有任何非托管资源需要清理,您是否需要实现终结器? 在我看来,如果该类只有托管资源并且您不调用 Dispose,则托管资源将自动被 GC 清理,因此无需实现终结器.我错了吗? 另外,如果我使用我的 Dis ..
发布时间:2022-01-16 09:49:30 C#/.NET

GC.Collect() 和完成

好的,众所周知,当 GC 将对象识别为垃圾时,它会隐式调用对象的 Finalize 方法.但是如果我执行 GC.Collect() 会发生什么?终结器是否仍在执行?可能是个愚蠢的问题,但有人问我这个问题,我回答“是",然后我想:“这完全正确吗?" 解决方案 好的,众所周知,当 GC 将对象识别为垃圾时,它会隐式调用对象的 Finalize 方法. 不不不.这不是已知,因为要成为k ..
发布时间:2022-01-16 09:42:13 C#/.NET

当我们没有析构函数时为什么要调用 SuppressFinalize

我有几个问题我无法得到正确答案. 1) 当我们没有析构函数时,为什么要在 Dispose 函数中调用 SuppressFinalize. 2) Dispose 和 finalize 用于在对象被垃圾回收之前释放资源.无论是托管资源还是非托管资源,我们都需要释放它,那么为什么我们需要在 dispose 函数中添加一个条件,当我们从 IDisposable:Dispose 调用这个被覆盖的 ..
发布时间:2022-01-16 09:41:49 C#/.NET

GC.Collect() 没有立即收集?

在聊天讨论过程中,我编写了这个控制台应用程序. 代码: 使用系统;课堂节目{静态无效主要(字符串 [] 参数){创建类();Console.Write("正在收集...");GC.Collect();Console.WriteLine("完成");}静态无效 CreateClass(){SomeClass c = new SomeClass();}}类 SomeClass{~SomeCla ..
发布时间:2022-01-16 09:39:58 C#/.NET

完成期间对对象的引用

如果在 finalize 调用期间保存对当前对象的引用会发生什么?例如: 类 foo {...公共无效finalize(){bar.REFERENCE = 这个;}} 对象是否被垃圾回收?当您稍后尝试访问 bar.REFERENCE 时会发生什么? 解决方案 对象没有被垃圾回收.这被称为“对象复活". 您必须小心,一旦调用终结器,gc 就不会再次调用它,在 .NET 等某些环境中 ..
发布时间:2022-01-16 09:38:24 Java开发

.net 终结器是否总是执行?

终结器是否可以保证在某些时候在 .NET 中执行(备用电源中断等)?我知道 GC 是如何工作的,而且它们运行的​​确切时间是不确定的. (搜索没有显示好的答案,所以我添加这个问题是为了与不太容易发现的实际答案合并.除此之外,我已经知道回答并在几天后添加它,以防没有人提到它.) 解决方案 Finalizers 实际上可能永远被执行,如 Raymond Chen 解释.这个问题是在他一年 ..
发布时间:2022-01-16 09:34:42 C#/.NET

从终结器调用 RCW 是否安全?

我有一个托管对象,它调用 COM 服务器来分配一些内存.托管对象必须在托管对象消失之前再次调用 COM 服务器以释放该内存以避免内存泄漏.此对象实现 IDisposable 以帮助确保进行正确的内存释放 COM 调用. 如果Dispose 方法被 调用,我希望对象的终结器释放内存.问题是,终结的规则是你不能访问任何引用,因为你不知道在你之前已经被 GC 和/或终结的其他对象.这使得唯一可触摸 ..
发布时间:2022-01-14 11:41:36 C#/.NET

静态终结器

执行某些静态终结的正确方法是什么? 没有静态析构函数.AppDomain.DomainUnload 事件不会在默认域中引发.AppDomain.ProcessExit 事件在所有事件处理程序之间共享三秒(默认设置)的总时间,因此它不是真正可用. 解决方案 基本上,你不能.尽最大可能围绕它设计自己的方式. 不要忘记程序无论如何都可以总是突然终止——有人拔掉电源就是一个明显的例子. ..
发布时间:2022-01-05 20:24:28 C#/.NET