随笔 - 40  文章 - 1 评论 - 10 trackbacks - 0
  (以下部分内容摘自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)  编辑 收藏

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
另存  打印
最新IT新闻: