第13章 结构

C#的结构(struct)和类很相似,却也存在着不同。在学习第4章值类型的时候,我们知道了值类型中除了枚举类型都是结构类型的派生类型。那么,结构和类到底是什么关系?它们可以互相替换吗?它们各自的使用场合是什么?本章将回答这一系列问题。

13.1 什么是结构

C#中结构类型和类(class)类型在语法上非常相似,它们都是一种数据结构,都可以包含数据成员和方法成员。但结构和类也存在着重要的差别,在这里首先谈谈比较重要的两点区别,其他一些内容请参阅13.7节:

❑结构是值类型,它在栈中分配空间;而类是引用类型,它在堆中分配空间,栈中保存的只是引用。

❑结构类型直接存储成员数据,让其他类的数据位于堆中,位于栈中的变量保存的是指向堆中数据对象的引用。

我们已经了解了这样一个事实:CTS中的简单类型如int、double、bool等都是结构类型。如果需要的话,甚至可以使用结构类型结合运算符重载,再为C#语言创建出一种新的值类型来。

由于结构是值类型,并且直接存储数据,因此,在一个对象的主要成员为数据且数据量不大的情况下,使用结构会带来更好的性能,具体细节稍后叙述。

那么如何定义一个结构类型呢?很简单,使用struct关键字即可,如代码清单13-1所示。

代码清单13-1 声明结构的语法


public struct AddressBookEntry

{

//字段、属性、方法、事件等

}


接下来看一段代码,从而对结构有个初步认识。在代码中,我们声明了一个名为AddressBookEntry的结构,它代表电话簿中的一条记录,有三个字段:Name、MobilePhone、Birthday,分别存储姓名、手机号码、生日。然后,就是演示如何使用这个结构,在Main函数中,先声明了一个AddressBookEntry类型的变量entry,然后为字段赋值,最后将结构所包含的值打印到控制台,见代码清单13-2。

代码清单13-2 结构类型示例


public struct AddressBookEntry//定义一个结构

{

public string Name;//姓名

public string MobilePhone;//手机号码

public DateTime Birthday;//生日

}

public class StructSample

{

public static void Main()

{

AddressBookEntry entry;//声明结构类型的变量

entry.Name="Tom";//为结构中的数据成员赋值

entry.MobilePhone="1234567";

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

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

entry.MobilePhone,entry.Birthday);

}

}