13.4 构造函数
结构类型可以有实例构造函数和静态构造函数,但不能有析构函数。下面将对这两种类型的构造函数进行介绍。
13.4.1 实例构造函数
结构类型都有一个预定义的、没有参数的构造函数,此构造函数不允许删除和重定义,并且这个无参数的构造函数将会一直存在,并不会因为定义了其他带参数的构造函数就消失,这一点和类不同。
要调用结构的实例构造函数,必须使用new运算符,我们在前面的示例代码中并没有使用new运算符,但这两种方式是有区别的,如果不是new运算符,那么结构的数据成员就是未分配状态,在分配之前是不能访问的,具体如表13-2所示。
接下来,我们看一个例子,如代码清单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}