13.4.2 静态构造函数

和类一样,结构类型也可以有静态构造函数,静态构造函数用于初始化静态数据成员。静态构造函数具有如下特点:

❑静态构造函数不能有访问修饰符和参数;

❑静态构造函数不能访问实例成员;

❑静态构造函数无法直接进行调用。

特别需要注意的是,结构和类的静态构造函数的触发规则不同,类的静态构造函数是在创建第一个实例或引用任何静态成员之前自动调用的,而结构的静态构造函数在下述任意一种情况之前才会被自动调用:

❑使用显式声明的构造函数进行初始化;

❑调用结构的方法或访问结构的静态数据成员(无论读取还是赋值,访问实例数据成员不会触发CLR自动调用静态构造函数)。

接下来,我们看一段示例代码,如代码清单13-7所示。

代码清单13-7 静态构造函数示例


1 using System;

2

3 namespace ProgrammingCSharp4

4{

5

public struct AddressBookEntry

6

{

7

public string Name;//实例成员

8

public string MobilePhone;

9

public DateTime Birthday;

10

public static string SaveLocation;//静态成员

11 12

//静态构造函数

13

static AddressBookEntry()

14

{

15

System.Console.WriteLine(“静态构造函数执行。”);

16

}

17 18

//显式定义的构造函数

19

//它必须初始化结构的所有数据成员

20

public AddressBookEntry(string name,string mobilePhone,string birthDay)

21

{

22

if(name==null||mobilePhone==null||birthDay==null)throw new ArgumentException();

23

this.Name=name;

24

this.MobilePhone=mobilePhone;

25

this.Birthday=DateTime.Parse(birthDay);

26

}

27 28

public void Print()

29

{

30

System.Console.WriteLine(“姓名:{0}手机:{1}生日:{2}”,Name,MobilePhone,Birthday);

31

}

32

}

33 34

public class StructSample

35

{

36

public static void Main()

37

{

38

//静态构造函数不会执行

39

AddressBookEntry e1=new AddressBookEntry();

40

//调用了显式声明的构造函数,静态构造函数执行

41

AddressBookEntry e2=new AddressBookEntry("Tom","1234567","1990-1-1");

42

//访问了类的静态成员,静态构造函数执行

43

AddressBookEntry.SaveLocation="C";

44

}

45

}

46}


上述代码的运行结果为:


静态构造函数执行。