13.4 构造函数

结构类型可以有实例构造函数和静态构造函数,但不能有析构函数。下面将对这两种类型的构造函数进行介绍。

13.4.1 实例构造函数

结构类型都有一个预定义的、没有参数的构造函数,此构造函数不允许删除和重定义,并且这个无参数的构造函数将会一直存在,并不会因为定义了其他带参数的构造函数就消失,这一点和类不同。

要调用结构的实例构造函数,必须使用new运算符,我们在前面的示例代码中并没有使用new运算符,但这两种方式是有区别的,如果不是new运算符,那么结构的数据成员就是未分配状态,在分配之前是不能访问的,具体如表13-2所示。

13.4 构造函数 - 图1

接下来,我们看一个例子,如代码清单13-5所示。

代码清单13-5 实例构造函数


1 public struct AddressBookEntry

2{

3 public string Name;//结构的数据成员

4 public string MobilePhone;//结构的数据成员

5 public DateTime Birthday;//结构的数据成员

6

7 public void Print()//结构的成员方法

8{

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

10}

11}

12 public class StructSample

13{

14 public static void Main()

15{

16 AddressBookEntry entry,entry2;

17//还未赋值,编译错误

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

19//未赋值前也不能调用结构的方法,编译错误

20 entry.Print();

21 entry.Name="Tom";

22 entry.MobilePhone="1234567";

23 entry.Birthday=DateTime.Parse("2000-1-1 12:12:12");

24//正确,因为已赋值

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

26

27 entry2=new AddressBookEntry();

28//正确,因为使用new运算符,默认构造函数会为数据成员赋值

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

30}

31}


前面实例化结构类型使用的是结构预定义的无参构造函数,还没有自定义的构造函数,现在我们来定义一个带参数的构造函数,其语法和和类相同。不过需要注意的是,带参数构造函数必须初始化结构的所有数据成员,并保证数据成员确实被初始化,如代码清单13-6所示。

代码清单13-6 带参数的构造函数


1 public struct AddressBookEntry

2{

3 public string Name;

4 public string MobilePhone;

5 public DateTime Birthday;

6

7///<summary>

8///带参数的构造函数必须初始化结构的所有数据成员

9///</summary>

10///<param name="name"></param>

11///<param name="mobilePhone"></param>

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

13{

14 if(name==null||mobilePhone==null||birthDay==null)throw new ArgumentException();//检查所有参数均被赋值

15 this.Name=name;

16 this.MobilePhone=mobilePhone;

17 this.Birthday=DateTime.Parse(birthDay);

18}

19}