今天花了一些时间把静态构造函数的用法总结了一下,希望高手们指点。谢谢!
静态构造函数既没有访问修饰符,也没有参数。
如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。
在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。
如果类中的静态字段带有初始化,则静态字段的初始化语句将在静态构造函数之前运行。
一个类只能有一个静态构造函数。
无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
最多只运行一次。
静态构造函数不可以被继承。
示例代码如下:
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Program
{
public static int X;
//步骤2,因为在步骤1中调用了 Program.X,而在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
static Program()
{
X = B.Y + 1; //此时B.Y=0;
Console.WriteLine("static A()");
}
}
class B
{
/*步骤1
如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。
如果类中的静态字段带有初始化,则静态字段的初始化语句将在静态构造函数之前运行。*/
public static int Y = Program.X + 1;
static B()
{
Console.WriteLine("static B()");
}
static void Main()
{
Console.WriteLine("X = {0}, Y = {1}", Program.X, B.Y);
Console.ReadLine();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Program
{
public static int X;
//步骤2,因为在步骤1中调用了 Program.X,而在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
static Program()
{
X = B.Y + 1; //此时B.Y=0;
Console.WriteLine("static A()");
}
}
class B
{
/*步骤1
如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。
如果类中的静态字段带有初始化,则静态字段的初始化语句将在静态构造函数之前运行。*/
public static int Y = Program.X + 1;
static B()
{
Console.WriteLine("static B()");
}
static void Main()
{
Console.WriteLine("X = {0}, Y = {1}", Program.X, B.Y);
Console.ReadLine();
}
}
}
运行的结果是:
static A()
static B()
X=1,Y=2