Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#终结器调用静态方法_C#_.net_Static_Clr_Finalizer - Fatal编程技术网

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

从C#终结器调用静态方法,c#,.net,static,clr,finalizer,C#,.net,Static,Clr,Finalizer,杰弗里·里克特(Jeffrey Richter)在其《通过C#的CLR》一书中(如示例章节在线所示)指出: 此外,CLR不保证Finalize方法的调用顺序。因此,应该避免编写Finalize方法来访问其类型定义Finalize方法的其他对象;这些其他目标可能已经敲定。但是,访问没有定义Finalize方法的值类型实例或引用类型对象是完全可以的调用静态方法时还需要小心,因为这些方法可以在内部访问已完成的对象,从而导致静态方法的行为变得不可预测 我从上面的引语中理解了一切,但粗体的句子除外。如果静

杰弗里·里克特(Jeffrey Richter)在其《通过C#的CLR》一书中(如示例章节在线所示)指出:

此外,CLR不保证Finalize方法的调用顺序。因此,应该避免编写Finalize方法来访问其类型定义Finalize方法的其他对象;这些其他目标可能已经敲定。但是,访问没有定义Finalize方法的值类型实例或引用类型对象是完全可以的调用静态方法时还需要小心,因为这些方法可以在内部访问已完成的对象,从而导致静态方法的行为变得不可预测


我从上面的引语中理解了一切,但粗体的句子除外。如果静态方法只能使用其他静态成员,而这些静态成员引用的对象由于其生命周期而无法最终确定,那么静态方法如何在内部使用最终确定的对象?为什么调用实例方法是安全的?对不起,我的结论可能是错的,所以如果能对这个问题做出解释,我将不胜感激。提前感谢。

例如,我们有两门课:

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
Finalizer中删除对static方法的调用,因为调用
B
Finalizer时,我们的
A
对象已经完成了,而
manufactea
可以尝试访问最终确定的对象


我认为Jeffrey谈到了类似于此示例的内容。

考虑应用程序关闭-所有内容都被删除了,您永远不知道还有什么是活动的()。我明白了,但我可以将ManufacteA变成一个非静态方法,并从终结器调用它。我认为您描述了类似于此规则的内容:“因此,您应该避免编写Finalize方法来访问其类型定义Finalize方法的其他对象”