gpt4 book ai didi

c# - 从 C# 终结器调用静态方法

转载 作者:行者123 更新时间:2023-12-03 20:56:26 26 4
gpt4 key购买 nike

Jeffrey Richter 在他的 CLR via C# 一书中(如在线示例章节 Working with Types Requiring Special Cleanup 中所见)指出以下内容:

Also, the CLR doesn’t make any guarantees as to the order in which Finalize methods are called. So, you should avoid writing a Finalize method that accesses other objects whose type defines a Finalize method; those other objects could have been finalized already. However, it is perfectly OK to access value type instances or reference type objects that do not define a Finalize method. You also need to be careful when calling static methods because these methods can internally access objects that have been finalized, causing the behavior of the static method to become unpredictable.



我从上面的引文中理解了所有内容,但是粗体的句子。如果静态方法只能使用其他静态成员,这些成员引用了由于生命周期而无法最终确定的对象,并且为什么调用实例方法是安全的,那么它如何在内部使用已完成的对象?抱歉,我的结论可能有误,因此我将不胜感激对该问题的任何解释。提前致谢。

最佳答案

例如我们有两个类:

sealed class B
{
private A _a = new A();

~B()
{
B.ManipulateA(_a);
}

public static void ManipulateA(A a)
{
//manipulations with "A" object
}
}

sealed class A
{
~A() { }
}

所以如果 CLR 对调用 Finalize 方法的顺序不做任何保证 , 我们应该从 B 中删除对静态方法的调用终结器,因为我们的 A对象可以在 B 的时候已经完成调用终结器,并且 ManipulateA可以试试 访问最终对象 .

我认为杰弗里谈到了类似这个例子的事情。

关于c# - 从 C# 终结器调用静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60779767/

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