静态构造函数是在构造函数方法前面添加了static关键字之后形成的,并且没有修饰符(public,private),没有参数。
静态构造函数有哪些特点呢:
- 静态构造函数没有参数和修饰符修饰,因为静态构造函数不是程序员调用的, 而是由.NET框架在合适的时机调用的。
- 静态构造函数前面必须是static 关键字。
- 静态构造函数中不能实例化实例变量。(变量可以分为类级别和实例级别的变量,其中类级别的有static关键字修饰,也就是静态变量)。
- 静态函数的调用时机,是在类被实例化或者静态成员被调用的时候进行调用,并且是由.NET框架来调用静态构造函数来初始化静态成员变量。
- 一个类中只能有一个静态构造函数。
- 无参数的静态构造函数和无参数的构造函数是可以并存的。因为他们一个属于类级别,一个属于实例级别,并不冲突。
- 静态构造函数只会被执行一次。
- 就像如果没有在类中写构造函数,那么框架会为我们生成一个构造函数,那么如果我们在类中定义了静态变量,但是又没有定义静态构造函数,那么框架也会帮助我们来生成一个静态构造函数来让框架自身来调用。
下面看2个例子:
class Program
{
static void Main(string[] args)
{
//在创建第一个实例或者任何静态成员被引用时,.NET会自动调用静态构造函数来初始化类
//并且只会执行一次
Person p = new Person(); //此时A=1
Console.WriteLine(p.B);//1
Console.WriteLine(Person.A);//2
Console.WriteLine(p.B);//1 字段的初始化赋值只是在实例化对象的时候执行,而不是每次用字段的时候都执行
Console.WriteLine(Person.A);//2
Person p1 = new Person();
Console.WriteLine(p1.B);//2
Console.WriteLine(Person.A);//3
Console.WriteLine(p.B);//1
Console.WriteLine(Person.A);//3
Console.ReadKey();
}
}
class Person
{
public static int A = 0;
static Person()
{
A++;
}
public int B = A++;
}
执行结果为:
1
2
1
2
2
3
1
3
需要特别注意的是:在创建第一个实例或者任何静态成员被引用时,.NET会自动调用静态构造函数来初始化类;字段的初始化赋值只是在实例化对象的时候执行,而不是每次用字段的时候都执行。
class Program
{
static void Main(string[] args)
{
Student s1 = new Student();
Student s2 = new Student();
Console.ReadKey();
}
}
class Student
{
public static int Count = 0;
static Student()
{
Count++;
Console.WriteLine("静态构造函数--"+Count);
}
public Student()
{
Count++;
Console.WriteLine("构造函数--" + Count);
}
}
执行结果为:
静态构造函数–1
构造函数–2
构造函数–3
当第一次实例化时, Count值变成2, 当第二次实例化时, 则不会执行静态构造函数与静态变量. 此时Count的值变成3. 所以,最后结果Count值为3。