关于C#静态构造函数的几点说明
2015-10-24 19:27
609 查看
原文地址
http://www.cnblogs.com/michaelxu/archive/2007/03/29/693401.html#3207631
静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
在使用静态构造函数的时候应该注意几点:
1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
3、一个类只能有一个静态构造函数。
4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
5、最多只运行一次。
6、静态构造函数不可以被继承。
7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
静态类
是不能实例化的,我们直接使用它的属性和方法,静态类的最大特点就是共享。
1.仅包含静态成员
2.无法实例化
3.是密封的(sealed)
4.不能包含实例构造函数
示例:
结果 :x = 1 y =2
分析:1、首先,每一个项目有且只能有一个静态类的main函数作为入口函数。
而入口函数是最最先执行的。
2、由于main函数在B类里面,首先会初始化B类。而类的初始化顺序是:类里的静态变量,然后执行静态构造函数。
3、运行起先执行public static int y = A.x + 1;这个,执行这个的时候,先把y初始化为0.然后计算y的值。
4、计算y的值的时候,调用了A的静态变量x。那么就先初始化A类。
5、初始化A类时首先去执行public static readonly int x;执行这句,先把x初始化为0.
6、执行完接着执行A的静态构造函数x = B.y + 1;这是y还是初始化0.
7、计算得到x=1.然后回到public static int y = A.x + 1;得到y=2
8、然后再执行main函数。得出结果x=1,y=2
http://www.cnblogs.com/michaelxu/archive/2007/03/29/693401.html#3207631
静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
class SimpleClass { // Static constructor static SimpleClass() { // } }
在使用静态构造函数的时候应该注意几点:
1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
3、一个类只能有一个静态构造函数。
4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
5、最多只运行一次。
6、静态构造函数不可以被继承。
7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
静态类
是不能实例化的,我们直接使用它的属性和方法,静态类的最大特点就是共享。
1.仅包含静态成员
2.无法实例化
3.是密封的(sealed)
4.不能包含实例构造函数
示例:
#region 类A public class A { public static readonly int x; static A() { x = B.y + 1; } } #endregion #region 类B class B { public static int y = A.x + 1; static void Main(string[] args) { Console.WriteLine("x:{0} y:{1}",A.x,y ); Console.ReadLine(); } } #endregion
结果 :x = 1 y =2
分析:1、首先,每一个项目有且只能有一个静态类的main函数作为入口函数。
而入口函数是最最先执行的。
2、由于main函数在B类里面,首先会初始化B类。而类的初始化顺序是:类里的静态变量,然后执行静态构造函数。
3、运行起先执行public static int y = A.x + 1;这个,执行这个的时候,先把y初始化为0.然后计算y的值。
4、计算y的值的时候,调用了A的静态变量x。那么就先初始化A类。
5、初始化A类时首先去执行public static readonly int x;执行这句,先把x初始化为0.
6、执行完接着执行A的静态构造函数x = B.y + 1;这是y还是初始化0.
7、计算得到x=1.然后回到public static int y = A.x + 1;得到y=2
8、然后再执行main函数。得出结果x=1,y=2
相关文章推荐
- C#调用API函数查找窗体并关闭
- c# 快速验证代理IP是否有用
- C#自动换ip功能或者ip代理功能要这么实现
- C#几个基本概念
- 关于C#接口作用的理解
- C# 连接自动拨号与断开分析
- C#利用System.Uri转URL为绝对地址的方法
- c#换ip代理源码
- C# 验证代理IP的方法
- C#加密算法汇总(推荐)
- C# 编写简单的控制台应用程序 显示如下数字金字塔
- C#接口作用的深入理解
- C#入门经典
- C#Monitor类 Lock Mutex类详解
- C# LnkHelper
- c#后台调用脚本
- C# 因IIS回收导致定时器失效的解决方案
- C# 简单通信(一对多) 新增文件传输进度
- 20151024_002_C#基础知识(ArrayList,Hashtable,List,Dictionary)
- fields must be fully assigned before control is returned to the caller解决方案