静态构造函数
如果要形容一下在c#中初次见到静态构造函数这几个字到大致学习了它到底是怎么一回事,我想到的最恰当的表述就是:“买彩票中了特等奖(好神奇),主办方把奖品交到你手里,你一看是个信封(不会吧),哎呀,心凉了一半,再打开一看,里面有张纸取出来,纸上写了三个字‘逗你玩'(骗人)。”
就我所了解到的静态构造函数所带来的好处有两个:1,可以将静态属性放在一处来进行初始化,程序形式比较工整。2,在静态属性声明时不能通过一次简单的赋值来执行初始化时。除了以上两点(就那两点我还是觉得有点重复)真是不知道这个东西还有什么特殊用途,因此我觉得就直接将其归为一种特殊的静态属性(如此一来,貌似神奇的东西一下就回到真实面貌了)。
我们知道静态属性是属于类级别的,因此,静态构造函数也就属于类,但同时他又有构造函数的特点即不能显示调用,并且只在类第一次实例化时运行一次,同时我还想说的一点就是:它只是像构造函数(或者称其为类构造函数更贴切),因为在实例化对象时,它与对象毫无关系,因为无论你怎样实例化对象(只要可以实例化出),你会发现所有的这些对象在构造过程中与静态构造函数没有半点关系。说的更惨一点那就是静态构造函数即使第一次的运行也好像是搭了第一次实例化对象时的那个普通构造函数的顺风车,不过还反客为主,先行运行(貌似是static的功劳)。
下面我通过代码演示一下这个运行机制:
public class A
{
public int a;
public static int b=1;
static A()
{
Console.WriteLine(b);
Console.WriteLine("static constuctor");
}
public A()
{
Console.WriteLine("normal constuctor");
}
}
A a1 = new A();
A a2 = new A();
运行结果:
1
static constuctor
normal constuctor
normal constuctor
这里输出b主要就是想弄明白静态构造函数与静态属性哪个先执行。
再看一段代码,演示一下静态构造函数与实例对象是无关的:
public class A
{
public int a;
public static int b=1;
static A()
{
Console.WriteLine(b);
Console.WriteLine("static constuctor");
}
public A(int a)
{
Console.WriteLine("normal constuctor");
}
}
A a1 = new A(); // error
编译无法通过,错误原因:“test2.A”不包含采用“0”个参数的构造函数.
以上所谈为普通类中的静态构造函数,下面再来说说泛型类静态构造函数,原理基本相同,一看就懂。
了解泛型,那想必一定听说过封闭类型(或者其它名字但意思一样)
下面我就以一个听起来复杂的例子来结束这次探讨:
public class Outer<T>
{
public class Inner<U,V>
{
Console.WriterLine("Outer<{ 0 }>.Inner<{ 1 },{ 2 }>",typeof(T),Name,typeof(U),Name,typeof(V),Name);
}
public void f ( )
{
}
}
为简单起见,此处定义六个匿名对象
Outer<int>.Inner<string,DateTime>.f( );
Outer<string>.Inner<int,int>.f( );
Outer<object>.Inner<string,object>.f( );
Outer<string>.Inner<string,object>.f( );
Outer<object>.Inner<object,string>.f( );
Outer<string>.Inner<int,int>.f( );
输出结果:
Outer<int>.Inner<string,DateTime>
Outer<string>.Inner<int,int>
Outer<object>.Inner<string,object>
Outer<string>.Inner<string,object>
Outer<object>.Inner<object,string>
解释:在第一次调用 f( )时,不管使用的什么类型,都会导致Inner类型的初始化,此时静态构造函数打印一行信息。每个不同的类型实参列表都被看做一个不同的封闭类型。每个封闭类型的静态构造函数只执行一次。所以,代码不会产生第六行的输出。Outer<string>.Inner<int,int>的静态构造函数在之前第三行已经执行过了。
ps:红黑树初探。(目测于9.15发布)