静态构造函数趣谈!
来源:互联网 发布:网络配线架标签 编辑:程序博客网 时间:2024/06/05 00:24
CLR会选择如下时间之一来调用静态构造函数:
1,在类型的第一个实例创建之前,或类型的非继承字段或成员第一次访问之前。这里的“之前”,代表前后衔接的意思。这里的时刻是精确的!
2,在非继承的静态字段或成员第一次访问之前的某个时刻,具体时刻不定!
由于调用的时刻不确定,所以我们最好不要编写依赖于特定的静态构造函数的执行顺序的代码,这样很容易产生不可预料的后果!
下面大家看三个Demo,我们来更加深入的看看静态构造函数的一些有趣的行为:
Demo1:
static void Main(string[] args) { Console.WriteLine(B.strText); } public class A { public static string strText; static A() { strText = "aaaa"; } } public class B : A { static B() { strText = "bbbb"; } }
大家猜猜结果是什么,可能有人认为输出的是bbbb,因为访问B.strText需要调用B类的静态构造函数static B()。实际上输出的结果是aaaa,因为strText是类A的静态字段,而类B只是继承了这个字段,所以这里会调用类A的静态构造函数static A(),所以输出结果是aaaa。这也没有什么真正可说的,相信大家都能看出这个结果的。
下面看看第二个Demo:
Demo2:
static void Main(string[] args) { B b = new B(); A a = new A(); Console.WriteLine(B.strText); } public class A { public static string strText; static A() { strText = "aaaa"; } } public class B : A { static B() { strText = "bbbb"; } }
在执行 new B(); 之前,B类的静态构造函数会调用,也就是会调用:
static B()
{
strText="bbbb";
}
当执行到strText=“bbbb"的时候,这时需要访问strText字段,而B的strText字段是从A类继承的,所以这里需要会先调用:
static A()
{
strText="aaaa";
}
执行这个函数以后strText的值是aaaa
然后代码又回到static B()中,这时才执行static B()中的strText="bbbb"这行,所以strText这时的值是bbbb
当执行A a=new A();的时候,不会在调用A的静态构造函数了,因为前面已经调用过了,静态函数在整个应用程序域的生命周期中只会调用一次!
请大家多指教啊!
- 静态构造函数趣谈!
- 静态构造函数,静态类
- [整理]静态构造函数
- 静态构造函数【转载】
- C# 静态构造函数
- 静态构造函数
- 静态构造函数
- 静态构造函数
- C#静态构造函数
- 关于静态构造函数
- C# 静态构造函数
- C# 静态构造函数
- C#静态构造函数
- 静态构造函数
- 静态构造函数
- C#静态构造函数
- C#静态构造函数
- 静态构造函数
- 黑马程序员____基础____多线程
- POJ 2186 Popular Cows+POJ 1236 Network of Schools+UVA 11324 The Largest Clique
- 使用matlab 将avi视频转换成图像帧
- node.js tcp服务端实现
- 杭电 HDU 1016 Prime Ring Problem
- 静态构造函数趣谈!
- 超级有用的CSS编码工具集
- Xcode4.6 自制iOS可用的 Framework
- jsreader js模板框架,
- 职场人生(十五):假期和前途,二者不可得兼
- cocos2d-x win32开发移植到Android平台
- 自动化测试电子杂志大全[ 持续更新 ]
- oracle修改密码
- Ubuntu关闭按钮移到右上角