gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:51:19 24 4
gpt4 key购买 nike

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

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

public class ResourceWrapper {
private readonly bool _ownsResource;
private readonly UnmanagedResource _resource;

public ResourceWrapper(UnmanagedResource resource, bool ownsResource) {
_resource = resource;
_ownsResource = ownsResource;
if (!ownsResource)
GC.SuppressFinalize(this);
}
~ResourceWrapper() {
if (_ownsResource)
// clean up the unmanaged resource
}
}

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

但是 System.GC有方法来设置一个对象的可终结性(SuppressFinalizeReRegisterForFinalize),我没有看到任何方法来获取一个对象的可终结性。除了购买 Typemock 或编写我自己的 CLR 主机之外,是否有任何方法可以查询是否已在给定实例上调用 GC.SuppressFinalize?

最佳答案

这是不可能的,GC 只是不提供此信息。这样做的充分理由是,对象不仅可以处于两种状态。它也可能已经在完成队列中,或者可能已经完成。

自定义 CLR 主机不会帮助您解决这个问题,托管接口(interface)不提供任何进入 gc 的 Hook 。您可以通过在终结器中检查它来检查是否已调用 SuppressFinalize。记录它(快速)。你无法证明相反的情况。

Fwiw,.NET 框架类不这样做,它们只是让终结器运行。

关于c# - 我可以检测对象是否调用了 GC.SuppressFinalize 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4634671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com