1.静态构造函数
静态构造函数在类第一次被使用的时候执行一次,在构造函数执行之前执行。只要用到类,哪怕没new对象(比如只是声明变量)也会被执行,且只执行一次。
2.注意事项
- 静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
- 是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
- 一个类只能有一个静态构造函数。
- 无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
- 最多只运行一次。
- 静态构造函数不可以被继承。
- 如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
3.例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace console2 { class MyTest { static MyTest() { Console.WriteLine("zi 静态代码块"); } public MyTest() { Console.WriteLine("zi 构造方法"); } } } //主函数 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace console2 { class Program { static void Main(string[] args) { MyTest t1 = new MyTest(); MyTest t2 = new MyTest(); Console.ReadKey(); } } } //输出结果: // zi 静态代码块 // zi 构造方法 // zi 构造方法。
4.静态成员初始化问题代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace console2 { class MyJingTaiDaimaKuai { public static int i = test1();//最开始执行 public int age = test2();//new的时候先执行成员变量的初始化,再执行构造函数 static MyJingTaiDaimaKuai() { Console.WriteLine("静态代码块");//再执行 } public MyJingTaiDaimaKuai() { Console.WriteLine("构造函数"); } public static int test1() { Console.WriteLine("test1"); return 3; } public static int test2() { Console.WriteLine("test2"); return 333; } } } //主函数 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace console2 { class Program { static void Main(string[] args) { MyJingTaiDaimaKuai a1 = new MyJingTaiDaimaKuai(); Console.WriteLine(a1.age); MyJingTaiDaimaKuai a2 = new MyJingTaiDaimaKuai(); Console.WriteLine(a2.age); Console.ReadKey(); } } }