gpt4 book ai didi

.net - 是否允许终结器调用其他托管类的方法?

转载 作者:行者123 更新时间:2023-12-02 02:33:36 24 4
gpt4 key购买 nike

我曾经非常确定答案是“否”,如 Overriding the Finalize method 中所述和 Object.Finalize documentation .

然而,在随机浏览 FileStream 时在 Reflector 中,我发现它实际上可以从终结器中调用这样一个方法:

private SafeFileHandle _handle;

~FileStream()
{
if (this._handle != null)
{
this.Dispose(false);
}
}

protected override void Dispose(bool disposing)
{
try
{
...
}
finally
{
if ((this._handle != null) && !this._handle.IsClosed) // <=== HERE
{
this._handle.Dispose(); // <=== AND HERE
}
[...]
}
}

我开始怀疑这是否会因为它的确切编写方式而始终有效,因此“不要接触终结器的托管类”是否只是一个可以在有充分理由和必要知识的情况下被打破的指导方针做正确的事。

我进行了更深入的研究,发现当“规则”被打破时可能发生的最坏情况是被访问的托管对象已经完成,或者可能正在单独的线程上并行完成。因此,如果 SafeFileHandle 的终结器没有做任何会导致后续调用 Dispose 失败的事情,那么上面应该没问题……对吧?

问题:那么在某些情况下,另一个托管类上的方法可以从终结器可靠地调用?我一直认为这是错误的,但这段代码表明这是可能的,并且有足够充分的理由去做。

奖励:观察 SafeFileHandle甚至不知道它是从终结器调用的,因为这只是对 Dispose() 的正常调用.基类,SafeHandle ,其实有两个私有(private)方法,InternalDisposeInternalFinalize ,在本例中为 InternalDispose将被调用。这不是问题吗?为什么不呢?...

最佳答案

是的,终结器可以调用其他方法。该死,你甚至可以做一些有趣的事情,比如重新注册类型以进行终结。但是在处理可终结实例时,您必须显式检查 null,因为不能保证终结器以任何顺序运行。

在那种情况下,只需要尽可能完美地结束事情即可。如果句柄还没有被终结,酷,让我们处理它,否则,好吧,终结者已经尽力了。

关于.net - 是否允许终结器调用其他托管类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2792288/

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