(以下部分内容摘自Tom Archer和Andrew Whitechapel 著的"inside C#")
使用结构比类的效率高(这归因为它们底层的值类型结构),但是它们的局限性制约了它们的使用范围.一般的原则是只有在以下情况下才使用结构:
.被包含的数据非常小.例如,包含Point值(x和y),RGB值或简单的应用程序或对象状态信息的结构.
.结构只包含了很少几个(甚至不包含)用于访问或修改结构中数据的方法.记住,类是对数据以及操作此数据的方法的封装.而结构只被当成数据.
以下是一个实际的结构的例子,它结合了结构和静态字段的优点,创建出一个非常高效的构造.假设我们希望在RGB结构中定义某些常用颜色,这样,结构的客户就不用记住每种颜色的准确的RGB值.我们可以定义一个常量或者枚举值,客户将它们传递给构造器.然后,构造器对结构的红,绿,蓝值进行相应的实例化.
using System;
struct RGB
{
public static readonly RGB RED = new RGB(255,0,0);
public static readonly RGB GREEN = new RGB(0,255,0);
public static readonly RGB BLUE = new RGB(0,0,255);
public RGB(int red,int green,int blue)
{
Red = red;
Green = green;
Blue = blue;
}
public int Red;
public int Green;
public int Blue;
public override string ToString()
{
return (Red.ToString("X2") + Green.ToString("X2") + Blue.ToString("X2"));
}
}
class StructApp
{
static void PrintRGBValue(string color,RGB rgb)
{
Console.WriteLine("The value for {0} is {1}",color,rgb);
//注:在此会发生装箱操作(rgb是值类型).
//只要对象在被处理的时候被当成是string类型,都会调用基类的ToString方法,
//而在此RGB重写了ToString方法,如果改为rgb.ToString(),则不会发生装箱操作.
//而会直接调用它重定义的ToString方法
}
public static void Main()
{
PrintRGBValue("red",RGB.RED);
PrintRGBValue("green",RGB.GREEN);
PrintRGBValue("blue",RGB.BLUE);
}
}
运行结果如下:

而由于RGB是值类型的,如果不重写ToString方法,就会调用ValueType类型的ToString方法,输出结果如下:

另外,由于结构体中定义了三个静态只读变量,所以在IL代码中会调用.cctor(静态构造函数)
分析:
.因为只存储了少量数据(三个字段),所以使用结构比使用类效率高.
.客户可以很容易地访问键值,而不必记住与它们对应的RGB值.
.每个RGB键值对于整个系统只定义一次.显然,这比在每次需要这些颜色时都分配新结构要高效得多.
posted on 2007-06-13 19:23
谢良威 阅读(32)
评论(0) 编辑 收藏