关于静态变量与静态构造函数的执行顺序

sdfdl 2009-12-03 05:09:06
//环境vs2005,代码如下:
using System;
using System.Collections.Generic;
using System.Text;

namespace TestInitialize
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
Console.WriteLine("Programme Begin");
Base Test = Base.instance;
Console.ReadLine();

}
}

class Base
{
Base()
{
Console.WriteLine("Base Class constructor has been initialized");
}

//static Base()
//{
// Console.WriteLine("Base Class static constructor has been initialized");
//}

static public Base instance = new Base();
}
}

//问题:
1、以上执行结果为:
Base Class constructor has been initialized
等待输入_

怎样解释class Base的静态变量在main的Base Test = Base.instance;之前就进行初始化?

2、解除注释部分,程序等待输入,结果为:
等待输入_
Base Class constructor has been initialized
Base Class static constructor has been initialized

静态变量的赋值先于静态构造函数的执行?这个顺序是固定的么?导致与问题1的效果的差异的原因?
...全文
472 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xeon_pan 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lcl_data 的回复:]
引用 7 楼 alonesword 的回复:
这个问题已经说过了,请看这里:
http://topic.csdn.net/u/20091123/22/a284f187-04fd-4f4d-bf7e-20c1ce1e263d.html



回答的蛮好

在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类

[/Quote]

这个问题的关键在于 静态构造函数和普通构造函数 执行的顺序
xeon_pan 2009-12-04
  • 打赏
  • 举报
回复
帮顶,我也有同样的疑问
sdfdl 2009-12-03
  • 打赏
  • 举报
回复
to AloneSword、LCL_data:

不明白啊……

Base不存在静态构造函数的情况下,也就是使用默认静态构造函数的时候:
static void Main(string[] args)
{
Console.ReadLine();
Console.WriteLine("Programme Begin");
Base Test = Base.instance;
Console.ReadLine();

}
会先初始化Base的静态变量再去进行第一次readline

但Base存在一个什么都不做的静态构造函数的情况下,同一个静态变量,反而是到了类静态成员被引用的前一刻才被调用?

这个问题不是非静态和静态之间的差异而是静态和静态之间的差异吧,而且静态构造函数的初始化时刻已经不是问题了,因为在调用静态构造函数之前,两个静态变量的赋值时间就已经不一样,一个在readline前一刻在readline后,而这一切只是多了个静态构造函数?

那个非静态构造函数应该是不用理会的,因为两个变量都使用了这个构造函数进行赋值。
十八道胡同 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 alonesword 的回复:]
这个问题已经说过了,请看这里:
http://topic.csdn.net/u/20091123/22/a284f187-04fd-4f4d-bf7e-20c1ce1e263d.html


[/Quote]
回答的蛮好

在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类
孤剑 2009-12-03
  • 打赏
  • 举报
回复
这个问题已经说过了,请看这里:
http://topic.csdn.net/u/20091123/22/a284f187-04fd-4f4d-bf7e-20c1ce1e263d.html

whycom 2009-12-03
  • 打赏
  • 举报
回复
例如:
class b..
class a{
static b ins = new b();
static a()
{
//不先调用 static b ins = new b();的话
b.somethod() //这里会照成异常

}
}
whycom 2009-12-03
  • 打赏
  • 举报
回复
static public Base instance = new Base();
sdfdl 2009-12-03
  • 打赏
  • 举报
回复
其实最让我不解的问题是:
交给.net去自动生成默认静态构造函数的话,会造成Base类的静态变量的初始化被提前执行,而自定义(即使这个静态构造函数什么都没做过!)之后则会乖乖地等待到调用前一刻再去执行……

另外声明静态变量的赋值可以先于静态构造函数我估计是因为确保变量在初始化后数据以静态构造函数为准。

//在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类
这是msdn的原话,我错误地理解成会保证在成员的声明之前调用
tianrui456 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hhc123 的回复:]
自已断点一下啊
[/Quote]
对应该调试一下, 我调试结果 完全打翻我在2楼的假设.
给出调试结果:很明显的发现 在进入类内部的时候 类成员的默认初始化工作比构造函数要早一步(不管是定态的还是普通的) 在楼主的例子中 static public Base instance = new Base(); 这一句被当成一个赋值语句先被执行了
tianrui456 2009-12-03
  • 打赏
  • 举报
回复
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。

如果用

public class ADBase
{
private string x;
static ADBase()
{
Console.WriteLine("定态");
}

public ADBase()
{
Console.WriteLine("基础");
}
}

ADBase aTest = new ADBase();//如果这样就可以看到定态构造早于一半构造


静态构造函数用于初始化任何静态数据
所以我进行了这样的假设:对于楼主的写法 还是定态构造函数比普通构造要早, 它先执行的是定态构造函数来初始化定态成员instance,但是instance有默认值 而这个默认值是通过函数Base()(即当前这个Base() 当作一个普通函数来使用)产生的 所以先调用普通Base() 中的打印函数,等这个构造完以后(即内存分配完以后)定态函数才执行了定态构造函数中的打印
个人理解不知道对不,不要见笑
hhc123 2009-12-03
  • 打赏
  • 举报
回复
自已断点一下啊

110,534

社区成员

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

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

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