与类一样,结构可以包含其他类型.结构有时被称为类的轻型版本,因为结构在内部是值类型的.因此,结构不承担引用对象(比如类)所带来的开销,但在被装箱时除外.结构有一些重要的限制,这使她们只能用于非常特殊的场合.
定义结构的语法几乎与定义类是完全一样的:
[attributes][modifiers] struct <structName>[:interfaces]
{
[struct-body]
} [:]
例如,下面定义了一个标准的RGB结构,其中有包含红、绿和蓝值的字段:
struct RGB
{
public int Red;
public int Green;
public int Blue;
}
到目前为止,这个声明很象一个类。但是,你马上就会看到前面提到的在使用结构方面的许多限制。现在,我们来看看客户是如何使用这个结构的:
RGB rgb;
rgb.Red=0xFF;
rgb.Green=0xFF;
rgb.Blue=0xFF;
注意,客户不必对结构进行实例化(通过new 关键字).这是因为,作为一种值类型,结构一旦被声明,就被分配.这种用法显然与引用类型相反,引用类型需要进行实例化才能使用。但是要记住,因为有了这种用法,所以如果不亲自对结构的成员进行显示的初始化(使用new关键字),那么字段就不会被初始化.所以,以下代码无法编译,因为它试图使用一个未初始化的值:
RGB rgb;//ERROR :Use of unassigned field
Console.WriteLine(rgb.Red);
以下代码纠正了这个错误.注意,因为RGB.Red是一个值类型,所以初始化为0.
RGB rgb=new RGB();
Console.WriteLine(rgb.Red);
尽管我的RGB结构只包含字段,但是结构的成员可以是构造器、常量、字段、方法、特性、索引器、操作符以及嵌套的类型.但是,在构造器方面,结构有一个非常重要的限制,不能为结构创建无参数的构造器.因此,以下代码将产生编译时错误:
struct RGB
{
//ERROR:Structs cannot contain explicit
//parameterless constructors
public RGB();
public int Red;
public int Green;
public int Blue;
}
尽管不能为结构定义显示的无参数构造器,但是以下定义是合法的:
struct RGB
{
public RGB(int red,int green,int blue)
{
Red=red;
Green=green;
Blue=blue;
}
public int Red;
public int Green;
public int Blue;
}