不要 const,用 readonly?

作者:vkvi 来源:ITPOW(原创) 日期:2007-6-15

C# 中,const 表示常量,readonly 表示只读域,为了便于撰写本文,本文统称为常量。

网上流传:舍弃 const,使用 readonly。我认为这是不理智的做法。

const 与 readonly 本质的区别是,const 是编译时常量readonly 是运行时常量

编译时常量,就是在编译时就需要确定的;而运行时常量是在运行时确定的。以下三个示例帮助您理解:

 

int a = 1;
const int b = a * 3; //错误

错误,因为在编译时无法确定 a 值。

 

const int a = 1;
const int b = a * 3; //正确

正确,a 是常量,可以这样给 b 赋值。

 

class CFoo
{
    private int n;
    public readonly int r;
    
    public CFoo()
    {
        n = 1;
        r = n * 3; //正确
    }
}

正确,readonly 是运行时常量。

 

class CFoo
{
    private int n = 1;
    public readonly int r = n * 3; //错误
}

错误,实际上该错误并不是由 readonly 引起的,而是 field(不是 filed) 初始化不能引用一个非静态变量(未使用 static 或 const 标明的),该知识点不属于本文范畴,列出来只是用于正确理解 readonly。

 

再说说其它区别:

  • const 效率略高于 readonly。
  • const 只用于数字和字符串;readonly 用于任何类型。
  • const 用于全局变量、局部变量或 class 的 field;readonly 只用于 class 的 field,比如函数中就不能用 readonly,这就示上述示例中 readonly 为什么要放在 class 中的原因了。相关阅读:谈谈 const 与 readonly 的赋值
  • const 修饰的 class 的 field,为该类的所有实例共享;readonly 修饰的 class 的 field,为该类的某一个实例独享,除非我们加了 static。

看了上述区别,我们可以看出,我们不能抛弃 const,要 const 与 readonly 灵活使用,四点原则

  • 有些地方只能用 const。
  • 有些地方只能用 readonly。
  • 确定的值用 const,比如圆周率,再比如设计的系统中用 1 表示 OK。
  • 不确定但要求不允许更改的值用 readonly,这取决于实际应用,比如用户管理系统中不允许更改工号,那么工号就可以考虑用 readonly,因为在编译的时候,无法确定是哪个员工的工号。

最后请记住:const 表示常量,readonly 表示只读域。

相关文章