静态构造函数
静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
class SimpleClass
{
// Static constructor
static SimpleClass()
{
//
}
}
在使用静态构造函数的时候应该注意几点:
1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
3、一个类只能有一个静态构造函数。
4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
5、最多只运行一次。
6、静态构造函数不可以被继承。
7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
静态构造函数和闭包
之所以会记录这个静态构造函数的知识是因为我在查看编译器为Lambda生成的一个类,下列代码:
class Program
{
public delegate string HelloWord(string word);
static void Main(string[] args)
{
HelloWord world = word =>
{
Console.WriteLine(word);
return word;
};
world("HelloWorld");
Console.ReadKey();
}
}
编译器会为HelloWorld生成一个类型:
这个暂且不表,不属于本文要介绍的内容。接着来看lambda生成了什么:
word=>
{
Console.WriteLine(word);
return word;
};
对应这句,编译器为我们生成了一个类:
这个类中就有一个静态函数,这个静态函数会保证<>c
类的实例化(我推测的)。
这个类表达的意思是将上面这个Lambda表达式的方法放到了这个编译器生成的类中。闭包也是在这个基础上形成的,请看下面的代码:
class Program
{
static void Main(string[] args)
{
int x = 6;
Action<int> action = _ => Console.WriteLine(x);
}
}
Lambda表达式捕获了Main方法中的x变量之后,被编译器编译为下面这个类:
我以前的理解是只有Lambda表达式在捕获到变量的情况下才会生成一个类,现在来看,不管有没有捕获变量,编译器都会为Lambda表达式来生成一个类用来存储Lambda表达式所代表的方法,只是如果捕获了变量,这个类中会将外部变量打包进来。