事情是这样的
朋友是一个一年多经验的.Net开发人员
在面试新公司的时候,被面试官问到什么是"静态构造函数"
朋友回来告诉我,
"构造函数还有静态的吗,看来这次面试要黄了"
"对的,构造函数是有静态的啊,不过也难怪,很少人会用到,看来面试官是要看你的基础有多深啊!"
静态构造函数
我们知道,所有的静态成员,包括静态字段和静态方法,当程序运行遇到这些静态成员所在的类
在创建对象或者调用静态成员的时候,所有的静态成员会加载到内存的静态存储区,这个存储区
与栈、堆分开,所以我们可以直接用
类名.静态成员的方式对静态成员进行访问,不受对象控制.
同理.静态构造函数也是当程序运行到这个静态构造函数所在的类在创建对象或者调用静态成员的时候,这个静态构造函数就被"执行"
1 //声明一个Person类 2 class Person 3 { 4 static Person() 5 { 6 Console.WriteLine("这里是静态构造函数"); 7 } 8 public Person() 9 { 10 Console.WriteLine("这里是无参构造函数"); 11 } 12 }
调用Main()方法
1 static void Main(string[] args) 2 { 3 Person p=new Person() ; 4 5 Console.ReadKey(); 6 }
结果:
所以,静态构造函数是先于任何构造函数执行的
静态构造 函数不允许有访问修饰符如:public
那么,我们可以利用静态构造函数做什么呢?
1.利用静态构造函数对静态字段初始化,或调用静态方法
1 //声明一个Person类 2 class Person 3 { 4 private static readonly int age; 5 6 static Person() 7 { 8 age = 18; 9 Console.WriteLine("这里是静态构造函数"); 10 SayHi(); 11 } 12 static void SayHi() 13 { 14 Console.WriteLine("你好,我是静态方法,年龄是"+age); 15 } 16 }
这里,将方法和字段私有化,外部不能直接用类名. 出来,所以很好的利用的静态构造函数的作用 (虽然也可以封装成一个公共方法来访问)
还是调用上面的Main()函数
2.利用静态构造函数实现单例模式
由于涉及设计模式,这里只介绍静态构造函数所发挥的作用,读者有兴趣可以自行查阅相关资料了解单例模式
1 //声明一个Person类 2 class Person 3 { 4 private static readonly Person per; 5 6 public static int age; 7 static Person() 8 { 9 per = new Person(); 10 Console.WriteLine("这里是静态构造函数"); 11 } 12 private Person() 13 { 14 Console.WriteLine("这里是无参构造函数"); 15 } 16 }
1 static void Main(string[] args) 2 { 3 Person.age=18 ; 4 5 Console.ReadKey(); 6 }
结果:
①把默认的构造函数私有化private,因此外部不能再new出一个对象,若要创建对象,只能由自己创建自己
②为了触发静态构造函数来创建对象. 外部调用了一个静态字段,由此静态构造函数被触发
③由于静态构造函数只能被发动一次,所以创建的对象也只有一个
最后,如果我们要在外部访问这个被静态构造函数初始化的对象,那么我们可以在Person类中加入这个方法
1 public static Person GetInstance() 2 { 3 return per; 4 }
其实静态构造函数的用途并不广,我们不能为了用它而用它,
使用static之前要考虑清楚,因为它会提前占用系统资源,
虽说这里将静态构造函数,大家觉得可能对业务没什么帮助,的确
但是,我们更要做一名专业的程序员\软件工程师 起码被问到也可以自信地回答
本人对C#语法有浓厚的兴趣,欢迎大家关注我一起讨论C#语法