静态构造函数-私有构造函数
静态构造函数:转自http://www.cnblogs.com/nnhy/archive/2011/03/15/cctor.html
静态构造函数只会被调用一次,并且在它执行完成之前,任何其它线程都不能创建这个类的实例或使用这个类的静态成员!
这里面包含几层一次:
1,静态构造函数只会被调用一次,并且在所有对该类的访问之前。这一点我确信99.99%的人都知道。
2,“其它线程”。也就是说,只是其它线程不能创建实例和调用静态成员而已,当前线程仍然是可以的。
3,“创建实例或使用静态成员”。那么实例成员呢?当然不可能了,因为实例都无法创建,如何使用实例成员?
4,也是最隐秘的地方。测试代码中,在A的静态构造函数里面使用了匿名函数,而编译器会把它编译成为A的一个静态方法,因此,它就成了A的静态成员了,所以……
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test1
{
/*
* C#静态构造函数既没有访问修饰符,也没有参数。
* 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
* 无法直接调用静态构造函数。
* 在程序中,用户无法控制何时执行静态构造函数。
* C#静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
* C#静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
*/
public class A
{
public static int X;
static A()
{
X = B.Y + 1; //②跳到static B()执行
Console.WriteLine("static A()..."); //⑤输出static A()...
}
}
public class B
{
public static int Y = A.X + 1; //④它会跳到static A(),但是static A()在执行过程中
//A.X还是默认值0,所以Y=1 跳回②继续执行 得X=2
static B()
{
Console.WriteLine("static B()..."); //③输出static B()...
}
}
public class C
{
public static void Main()
{
int a = A.X; //①跳到static A()执行
int b = B.Y; //⑥static B()已经执行过一次,所以直接输出结果 b=1
Console.WriteLine("X={0},Y={1}", a, b);
}
}
}
上面这个例子转自http://www.cnblogs.com/iuices/archive/2011/10/20/2218521.html
还有一个例子http://www.cnblogs.com/xuefeng1982/archive/2009/10/19/1585865.html
浙公网安备 33010602011771号