gpt4 book ai didi

oop - 静态字段的有趣功能。 StackOverflow 异常

转载 作者:行者123 更新时间:2023-12-04 14:12:30 26 4
gpt4 key购买 nike

你有什么想法,为什么下面的代码:

public class A
{
public static int i = B.i + 1;
}

public class B
{
public static int i = A.i + 1;
}

拥有:

        int aa = A.i;
int bb = B.i;

表示 aa = 2 (!!!) 和 bb = 1。

我脑子里有堆栈溢出!!!据我了解,递归停止在静态方法上,但为什么呢?如果您将 int i 重写为 getter(以调试并理解它究竟为何如此工作),则会出现堆栈溢出异常。

最佳答案

毫无疑问,执行是这样发生的:

B.i 静态初始化程序首先运行,并设置 B.i = A.i + 1。由于A.i还没有初始化,A.i等于default(int),也就是0B.i 获取值 1

A.i 静态初始化程序在第二个运行,并设置 A.i = B.i + 1 = 2

由于静态初始化程序以未定义的顺序运行,您可能会发现每次运行它时都有一个不同的字段 2,或者当您对代码进行其他结构更改时它们会切换。但是,一个应该始终以 2 结束,而一个应该始终是 1

附言这与多态无关。

编辑:为了进一步了解静态初始化程序和构造函数的时间,您可能需要检查 this relevant portion of the C# specification.

关于oop - 静态字段的有趣功能。 StackOverflow 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/883612/

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