静态构造函数主要用来初始化静态变量的值.
这种函数只执行一次,在第一次创建类的对象的时候,就会自动调用它.
可以参考一下下面的代码.
class Welcome
{
public Welcome()
{
Console.WriteLine("构造函数 Welcome()");
}
static Welcome()
{
Console.WriteLine("构造函数 static Welcome()");
}
static void Main()
{
new Welcome();
new Welcome();
Console.ReadLine();
}
}
执行结果:
构造函数 static Welcome()
构造函数 Welcome()
构造函数 Welcome()
又比如下面的代码
{
static private int count;
static public int Count
{
get
{
return count;
}
}
public User()
{
count++;
}
static User()
{
count = 0;
}
}
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
Response.Write("User Count = " + User.Count);
Response.Write("<hr/>Creating User Alex.");
User Alex = new User();
Response.Write("<br/>User Count = " + User.Count);
Response.Write("<hr/>Creating User Rob.");
User Rob = new User();
Response.Write("<br/>User Count = " + User.Count);
Response.Write("<hr/>Creating User Jake.");
User Jake = new User();
Response.Write("<br/>User Count = " + User.Count);
}
这段代码的执行结果是:
User Count = 0
----------------------------------------------------------------------
----------
Creating User Alex.
User Count = 1
----------------------------------------------------------------------
----------
Creating User Rob.
User Count = 2
----------------------------------------------------------------------
----------
Creating User Jake.
User Count = 3
如果一些操作只希望被执行一次。这时候就可以考虑使用静态构造函数。当然如果设计的面向对象一些的话,那就是使用单件模式了。
静态构造函数可以在第一次调用静态类的任何方法、属性时自动调用,所以在静态构造函数里抛出的异常捕获比较麻烦。
静态构造函数自动被调用,不能被显式调用。虽然提供了许多约束条件,但是静态构造函数执行的确切时间和顺序是不确定的:
一个类的静态构造函数在这个类的任何实例被创建前执行。
一个类的静态构造函数在类的任何静态成员被引用前执行。
一个类的静态构造函数在它的所有派生类的静态构造函数执行之后执行。
一个类的静态构造函数从不会被执行一次以上。
一个类的静态构造函数在它的所有派生类的静态构造函数执行之后执行。
这个是指父类有一个静态构造函数,子类也有一个静态构造函数,比如下面的代码
namespace StaticConstruct
{
public class ObjectChild:ObjectParent
{
public ObjectChild()
{
Console.WriteLine("子类构造函数!");
}
static ObjectChild()
{
Console.WriteLine("子类静态构造函数!");
}
}
public class ObjectParent
{
public ObjectParent()
{
Console.WriteLine("父类构造函数!");
}
static ObjectParent()
{
Console.WriteLine("父类静态构造函数!");
}
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
ObjectChild obj = new ObjectChild();
Console.ReadLine();
}
}
}
执行的结果是:
子类静态构造函数!
父类静态构造函数!
父类构造函数!
子类构造函数!