静态构造函数静态构造函数是c#的一个新特性,很少用到。不过当我们想初始化一些静态变量的时候就可以声明一个静态构造函数。这个构造函数是属于类的,而不是属于哪个实例的,因此这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由NET自动调用。声明静态构造函数,只需要在构造函数名前面使用static修饰符就可以,例如:
class StaticClass
{
static StaticClass{) //静态构造函数
{
……
}
}
在使用静态构造函数的时候应该注意以以几点:
■ 静态构造函数既没有访问修饰符,也没有参数。因为是NET调用的,所以像public和private等修饰符就没有意义了。
■ 在创建第一个类实例或任何静态成员被引用时,NET将自动调用静态构造函数来初始化类,也就足说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
■ 一个类只能有一个静态构造函数。
■ 无参数的构造函数可以与静态构造数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
■ 最多只运行一次。
■ 静态构造函数不可以被继承。
■ 如果没有写静态构造函数,而类中包含有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
【例5.4】创建一个控制台应用程序项目,声明一个Person类并为这个类声明一些类成员,说明如何通过调用类的静态方法来发出静态构造函数的调用,从而将类中的每个静态字段初始化为默认值(Ch05Ex04)
(1)首先创建一个控制台应用程序项目,在代码编辑器中打开源文件Program.cs,在命名空间中声明一个内部类Person,代码如下:
class Person
{
static private string name;
static private int age;
static Person()
{
Console.WriteLine(”The static constructor invoked.”);
}
public static void ShowPersonInfo()//静态方法
{
Console.WriteLine(”The ShowPersonInfo method invoked.”);
Console.WriteLine(”Person.Name:{0}\tPerson.Age{1}”,Person.name,Person.age);
}
}
(2)在Program类的Main方法中编写以下代码:
Person.ShowPErsonInfo();//通过调用静态方法触发静态构造函数的执行
(3)可按”Ctrl+F5”组合健编译并运行程序,最后程序的结果如图5.7所示。
在此示例中,类Person有一个静态构造函数和两个静态数据成局name,age,以及一个静态成员函数ShowPersonlnf00。当调用静态的成员函数时,首先触发静态构造函数的执行,通过静态构造函数来初始化类中的成员,最后再执行静态的成员函数。因此,先输出静态构造函数的语句后,再输出静态成员函数的输出语句。
私有构造函数私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例。当一个类只声明了私有实例构造函数时,则在该类的程序外部既不能从该类派生出新的类,也不可能直接创建该类的任何实例。因此,如果欲设计一个类,它只包含静态成员而且有意使它不能被实例化,则只需要给它添加一个空的私有实例构造函数即可达到目的,例如:
public class Trig
{
private Trig(){} //私有构造函数,阻止创建类的任何实例
public const double PI= 3.14149265358979323846;
public static double Sin(double x){……}
public static double Cos(double x){……}
public static double Tan (double x){……}
}
Trig类用于将相关的方法和常数组合在一起,但是它不能被实例化,即Trig trig= new Trig()是错误的。因此,它声明了单个空的私有实例构造函数。若要取消默认构造函数的自动生成,必须至少声明一个实例构造函数。6