有时候,类中只包含极少的数据,因为管理堆而造成的开销显得极不合算。这种情况下,更好的做法是使用结构(struct)类型。由于 struct 是值类型,是在栈(stack)上存储的,所以能有效的减少内存管理的开销(当然前提是这个结构足够小)。
结构可以包含它自己的字段、方法和构造器。
int 实际上是 Sysytem.Int32 结构类型。
编译器始终会生成一个默认的构造器,若自己写默认构造器则会出错(默认构造器始终存在)。自己只能写非默认构造器,并且在自己写的构造器中初始化所有字段。
- struct Time
- {
- public Time()
- {
- // 编译时错误:Structs cannot contain explicit parameterless constructors
- }
- }
- struct NewYorkTime
- {
- private int hours, minutes, seconds;
- public NewYorkTime(int hh, int mm)
- {
- hours = hh;
- minutes = mm;
- } // 编译时错误,因为 seconds 未初始化
- }
可以使用 ? 修饰符创建一个结构变量的可空(nullable)的版本。然后把 null 值赋给这个变量。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace structType
- {
- class Program
- {
- static void Main(string[] args)
- {
- NewYorkTime? currentTime = null; // 结构类型也是值类型,可以声明为可空
- }
- }
- struct NewYorkTime
- {
- private int hours, minutes, seconds;
- public NewYorkTime(int hh, int mm)
- {
- hours = hh;
- minutes = mm;
- seconds = 0;
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace structType
- {
- class Program
- {
- static void Main(string[] args)
- {
- Time now = new Time(); // 调用默认构造器,从而自动初始化,所有字段为 0
- }
- }
- struct Time
- {
- private int hours, minutes, seconds;
- }
- }
字段(field)值如下:
![](http://hi.csdn.net/attachment/201108/9/0_1312879769a4Jf.gif)
下面这种方式,结构将不会被初始化,但是也不能访问。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace structType
- {
- class Program
- {
- static void Main(string[] args)
- {
- Time now; // 不进行初始化,若访问字段的值会造成编译错误
- }
- }
- struct Time
- {
- private int hours, minutes, seconds;
- }
- }
![](http://hi.csdn.net/attachment/201108/9/0_13128798547fNx.gif)
自己定义的构造器必须在构造器内把所有的字段初始化。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace structType
- {
- class Program
- {
- static void Main(string[] args)
- {
- Time now = new Time(12, 30);
- }
- }
- struct Time
- {
- private int hours, minutes, seconds;
- public Time(int hh, int mm)
- {
- hours = hh;
- minutes = mm;
- seconds = 0;
- }
- }
- }
结构中的字段不能在声明的同时进行初始化。
- struct Time
- {
- private int hours = 0; // 报错 'Time.hours': cannot have
- // instance field initializers in structs
- private int minutes, seconds;
- public Time(int hh, int mm)
- {
- hours = hh;
- minutes = mm;
- seconds = 0;
- }
- }