《Effective C#》读书笔记(2)

        Item 2: Prefer readonly to const

        第2项: 定义常量时,优先使用readonly,而不是const

        在C#中存在两种定义常量的方法。第一种是编译时(compile-time)的常量,一种是运行时(Runtime)的常量。
        
        编译时常量:public const int year= 2005;(使用const关键字)
        运行时常量:public static readonly int year= 2005;(使用readonly关键字)

        让我们先来看看这两种常量的区别:
        1、编译时常量的值永远不会改变;运行时常量可能具有不同的值。
        2、编译时常量只能在该字段的声明中初始化;运行时常量可以在声明或构造函数中初始化。
        3、编译时常量比运行时常量速度稍微快点,但是灵活性远远比不上运行时常量。
        4、编译时常量可以用来修饰函数内部常量和字段的常量,而运行时常量只能修饰字段常量。

        为什么要优先使用运行时常量呢?
        
        首先它能够定义更多的类型。编译时常量只能定义字符串和数值,而运行时常量的赋值在Runtime进行时,这样使它具有更多的灵活行,这样运行时常量的值就可以任何类型,但是你必须在构造器或初始化时给它赋值。同时运行时常量支持new来赋值:
        private static readonly  DateTime time= new DateTime( 2000, 1, 1, 0, 0, 0 );

        其次运行时常量可能具有不同的值,而编译时常量的值是唯一的。编译时常量是在编译时赋值的,要想改变它的值必须再次编译1次;而运行时常量是在运行时解析的,你可以在不需要再次编译的情况下改变它的值,这样就大大的增加了可维护性。可以看出编译时的常量只是值的替换,是硬代码;而运行时常量只是在runtime才被解析,并不是一个值,是动态载入的。
    
    让我们看看以下的例子体会下运行时常量的优势:
    

    比如建立1个类:
    
public class A
    {
        
public const int a=18;
        
public static readonly int b=20;
    }

    这时你在另一个类中(另一个assembly中)引用A类的两个常量:
    Console.WriteLine( 
"Value is {0},{1}", A.a,A.b ); 

    得到的结果是:Value 
is 18,20

    当我们修改A类为以下:
    
public class A
    {
        
public const int a=19;
        
public static readonly int b=21;
    }

    再次调用,你肯定会认为得到的结果是:Value 
is 19,21

    实际上得到值是18,
21。因为没有编译,编译时常量a的值并没有变化。


   

    总之,只有当你必须要在编译时确定值的情况下,才使用const。记住,这些值是永远不变的。其他一切情况下,使用readonly 最大的提高灵活性。


 

posted @ 2005-08-07 20:34 jierry 阅读(1192) 评论(7) 编辑 收藏

 回复 引用 查看   
#1楼2005-08-07 21:24 | 怀沙      
说明运行时常量这个例子应该补充说明一点
class A和使用class A中两个常量的程序应该是在不同的assembly中,否则容易造成误解.

我在看你的笔记的时候就迷糊了一下,修改了class A不编译如何运行?呵呵.后来找原文看了一下才明白原来在不同的assembly中.而修改class A后只是单独编译了assembly A,并没有重新编译整个程序.

 回复 引用 查看   
#2楼[楼主]2005-08-07 22:42 | jierry      
多谢指正^_^
没有说清楚是我的失误。

 回复 引用 查看   
#3楼2005-08-08 12:22 | 怀沙      
有没有这本书的CHM或PDF版?发给我一份好么?
我的邮箱是chaixl (at) gmail (dot) com

 回复 引用   
#4楼2005-09-15 18:07 | 徐晓建[未注册用户]
我查了上海书城、卓越等网站,都没有这本书买,作者有effective C#下载吗?
或者是有电子版的发到我邮箱里,谢谢:
xuxiaojian@cn.nwcyberbase.com

 回复 引用   
#5楼2005-09-20 11:15 | 王大荣[未注册用户]
给我一份这本书的CHM或PDF版,好吗?wdr_2008@126.com
 回复 引用   
#6楼2005-11-29 18:10 | KSL[未注册用户]
找了好久好久好久也没有找到电子版,作者如果有,拜托发到我都邮箱里hibernate_ksl@hotmail.com
 回复 引用   
#7楼2006-10-10 23:14 | YDX[未注册用户]
如果可以的话,我也想要一个电子版的,我的邮箱xy2917@163.com
谢谢~~