静态类初始化原理(里面有代码可以复制粘贴),顶者有分

chenqianlong 2007-03-17 10:22:14
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{

static class A
{
public static int a = B.b + 1;
static A()
{
Console.WriteLine("Static A()");
}
}
static class B
{
public static int b = A.a + 1;
static B()
{
Console.WriteLine("Static B()");
}


}
class C
{
static void Main(string[] args)
{
Console.WriteLine("A.a={0},B.b={1}",A.a,B.b);
Console.ReadLine();
}
}
}

将main方法分别放在A,B,C类中的时候,输出结果不同,为什么?
...全文
479 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhou_she 2007-09-17
  • 打赏
  • 举报
回复
static class A

static class B
编译能通过过吗?
chenqianlong 2007-03-17
  • 打赏
  • 举报
回复
设置端点方法搞定,多谢
ivorstar 2007-03-17
  • 打赏
  • 举报
回复
解释一下nicochang() 的意思,
当Main()在C中时,Console.WriteLine("A.a={0},B.b={1}",A.a,B.b); 首先访问A,A被创建后初始化内部成员a,
因为public static int a = B.b + 1;
A在初始化的时候访问了B,所以这里会导致B被创建,同样B被创建后初始化内部成员b,这时A已经被成功创建,且A.a有默认值0,所以B.b被初始化为1,之后调用静态构造函数。
程序指针返回,继续初始化A.a,则A.a=2,然后调用static A();

当Main()在A中时,会导致程序一进来就访问了A,根据上面的顺序,会先完成初始化B,后完成初始化A。Main()在B中也是一个意思。

可能说得有点乱,在成员定义处和静态构造函数处加断点调一下就明白了。
nicochang 2007-03-17
  • 打赏
  • 举报
回复
同时,程序的执行都是以堆栈方式
比如,你把main函数方到B class的时候,程序的执行顺序是这样:
因为是在B里,所以,先初始化B的静态变量,所以就先去初始化b,这时就会访问A.a,
这样就会初始化A Class,这时的B.b的状态是空间已经被分配了,但是还没有初始化,因此这个值有可能呢和编译器,以及编译方式不同而不同,一般来说,debug方式,这时的B.b应该是0
这样A.a就是1,然后执行A的静态构造函数
A这边完了,才是B
nicochang 2007-03-17
  • 打赏
  • 举报
回复
一般泛泛的讲,静态的东西是在程序一运行的时候就初始化好了,但是,严格意义上讲,是在静态的类(不官是类,还是类里的方法),第一次访问的时候初始化。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧