此代码是msdn上的一个例子
搜索了一下csdn和一些blog也有关于这个例子的问题
都在寻求此段代码的思路 本人惭愧也没有理解
所以发出此贴 已求帮助!
****************************************************************
using System;
class A
{
public static int X;
static A() {
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B() {}
static void Main() {
Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);
}
}
产生输出X = 1, Y = 2
要执行 Main 方法,系统在运行类 B 的静态构造函数之前首先要运行 B.Y 的初始值设定项。因为引用了 A.X 的值,所以 Y 的初始值设定项导致运行 A 的静态构造函数。这样,A 的静态构造函数将继续计算 X 的值,从而获取 Y 的默认值 0,而 A.X 被初始化为 1。这样就完成了运行 A 的静态字段初始值设定项和静态构造函数的进程,控制返回到 Y 的初始值的计算,计算结果变为 2。以上文字是msdn对此段代码的说明,没有理解!
************************************************************************
以下是我的疑点
************************************
对于这个输出我有点疑问,在这段代码编译运行的时候,首先,由于class B里面带有Main,所以肯定是要先运行static B(),但是在class B()中又有静态的字段,所以会先执行Y = A.X + 1这行代码,到了这里的时候,由于A.X这句,所以在class A中,程序会先执行静态构造器,静态构造器中的代码X = B.Y + 1,这个时候该怎么往下执行了?请教一下
搜索了一下csdn和一些blog也有关于这个例子的问题
都在寻求此段代码的思路 本人惭愧也没有理解
所以发出此贴 已求帮助!
****************************************************************
using System;
class A
{
public static int X;
static A() {
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B() {}
static void Main() {
Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);
}
}
产生输出X = 1, Y = 2
要执行 Main 方法,系统在运行类 B 的静态构造函数之前首先要运行 B.Y 的初始值设定项。因为引用了 A.X 的值,所以 Y 的初始值设定项导致运行 A 的静态构造函数。这样,A 的静态构造函数将继续计算 X 的值,从而获取 Y 的默认值 0,而 A.X 被初始化为 1。这样就完成了运行 A 的静态字段初始值设定项和静态构造函数的进程,控制返回到 Y 的初始值的计算,计算结果变为 2。以上文字是msdn对此段代码的说明,没有理解!
************************************************************************
以下是我的疑点
************************************
对于这个输出我有点疑问,在这段代码编译运行的时候,首先,由于class B里面带有Main,所以肯定是要先运行static B(),但是在class B()中又有静态的字段,所以会先执行Y = A.X + 1这行代码,到了这里的时候,由于A.X这句,所以在class A中,程序会先执行静态构造器,静态构造器中的代码X = B.Y + 1,这个时候该怎么往下执行了?请教一下
解决方案 »
- webform 怎么禁止IE7或IE8以兼容模式运行页面
- .net中HTML怎样转换为Text
- List<int> a = new List<int>(),将a赋值后,执行List<int> b = new List<int>(),b = a。当我删除b中的元素时,a中的元素也自动被删除,如何解
- 关于泛型方法..在线等.
- C#2.0中的泛型类型的构造函数的声明语法如此的垃圾 大家进来看看我说得对不对
- 懂C#的真的很少呀~~~哎~~
- C# 串口编程中遇到的问题,遍求高手解决
- 一个带数据库(比如access)的项目能否刻进光盘,还有.net框架要不要一起刻进去?
- C#怎么画线?,一刷新原来的线就没了。
- Devexpress 中 gridControl 控件合并单元行问题
- 关于PetShop4.0登陆页面的问题
- [理解] 正则表达式
不是定义了
public static int Y = A.X + 1;
X = B.Y + 1
这两句互相引用 如何得出Y=0??????请讲讲运行的过程 结果都是勿庸置疑的
那B.Y被谁赋了0值呢?
public static int X; 为什么此时X不是0呢?
======================================================================
你贴说明也讲的比较清楚了
======================================================================
你贴说明也讲的比较清楚了
X为什么不被赋予0值呢
X = B.Y + 1;//在这句之前X也是0
}
int Y = A.X+ 1 这时A.X 为1
class A
{
public static int X;
static A() {
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B() {}
static void Main() {
Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);
}
}可以改写成这样吗?
public static int Y ;//这句可以理解值类型被分配初值0
Y= A.X + 1;//这句又利用赋值语句为静态字段重新赋值
所以说可以把原句分成两个步骤来理解是吗?
public static int Y = A.X + 1;
B.Y = 0;
A.X = 0;
A.X = B.Y + 1; //--此时B.Y = 0
B.Y = A.X + 1; //--此时A.X = 1
还是CLR先赋予B.Y
后再赋予A.X呢
这句还没有明白
此时X的赋值需要Y这个字段
大家说了Y被默认赋值0
但B类中有静态构造器
调用了B的静态成员
然后为什么没有转到B的静态构造函数
而是取了B的0值呢?
将代码稍微修改如下:
class A
{
public static int X;
static A() //第二步
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1; //第一步
static B() //第三步
{
string s= "dd";
s +="ee";
}
static void Main()
{
Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);
}
}搂住可以自己debug下看看,问题的理解我感觉应该在B类着手
因为B类中包含main函数所以程序一定从B类开始执行,而从B类开始执行的时候
并不限其他包含静态构造函数的类那样----"在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类"
,而是先对B类中的字段变量赋值,从而导致A类静态函数的执行,而在A类中用到的B.Y系统默认就是0,而且执行源来自包含Main函数的B类,所以并不回回去执行B的构造函数,而当B类中字段执行完之后,将进入B类的构造函数,然后执行B类的Main函数输出结果,不知道这样说楼住应该理解了吧
所说的
在A类的A()静态构造内
X=B.Y+1时 B.Y并没有调用B()静态构造
而是获得的默认0 为什么??????
根据静态构造运行的定义看 此时应该调用B()啊 因为X=B.Y+1调用了Y这个静态成员啊
*************************
类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数
*********************