8
9
2015
0

[Effective C#] Item 2: Prefer readonly to const


优先使用readonly而不是const。话说我在看这一章之前一直不知道C#里有readonly这个东西。。

C#中有两种常量:编译时常量和运行时常量。


编译时常量,即const,是在编译时就进行解析并用常量值替换对常量的引用。

例如这段代码:

 

在编译时编译器就会把它看作:

当然,只能对基本类型,如int,long,bool,string等,使用const,因为对于其他需要使用构造函数的类型,不能进行简单的值的替换。const必须在声明时就进行赋值,且只能用字面值和其他const值初始化。

同时,也因为这种处理方法,有时使用const会产生非预期行为。

例如,如果你做了一个项目,在里面声明了一些const,就像这样:

然后在另一个项目中,引用了它们:

当然,这会产生1~10的输出。

现在如果把第一个项目中的代码改掉:

然后,重新编译这个项目。

现在,预期的输出是1~15,但是,实际上,输出并没有变化,除非你重新编译第二个项目。

这是因为,在编译时,编译器把第二个项目的代码看作这样:

所以,即使重新编译第一个项目,输出也不会有变化。

注意!对const常量的修改,应该视作类借口的改变,必须重新编译所有引用它的程序集!


现在来看看运行时常量,即readonly。运行时常量在程序运行时才解析其值,所以编译器把它看成只读的变量。

readonly常量就比const强大多了。

readonly常量的初始化可以延迟到调用类的构造函数时(当然也只能初始化一次,不然和变量就没有区别了),可以使用其他变量初始化,可以使用基本类型以外的类型,也没有之前说的那个非预期的行为,因为值没有被替换。


现在看来,似乎只要用readonly就行了嘛。。其实也不是。

显然,因为readonly常量的行为更类似于变量,它的性能也比const要差一些,使用时要对性能和可靠性进行权衡。

同时const也有它适用的地方——在不同的程序版本中不会变化的值。以下面这段代码为例:

可以看到,用来表示特定版本号的常量可以用const,因为它们在不同的程序版本间时不变的,而用来制定当前版本号的常量则用readonly,因为它在版本改变时也会改变。

Category: C#及OOP | Tags: Effective C# | Read Count: 405

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com