思维的乐趣

Enjoy it
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

const 与 readonly 的注意事项

Posted on 2010-07-10 12:04  szh114  阅读(831)  评论(1编辑  收藏  举报

1: 凡是定义的const 成员变量,皆为隐式 static 的,也就是说,要用类名来访问,而不能用对象来访问。

想想很容易理解,一个变量,初始化的值固定了,各个实例中都一样都不能改,那么,何必保存那么多份呢?static 了只存一份就OK。

当然,上述情况的前提是这个 const 变量定义为 public 的,如果是 private 的,那么外部是无法访问的,所以不存在用类访问还是用对象访问的问题。

 

2:当一个变量的值不希望它被改变,但是这个值的初始值又无法在编译期获得,也就是说要到运行时才能由它方得到,那么这时用const 显然不行,因为const必须在声明时即初始化。这时就要用 readonly 型,readonly 型常量只允许在构造函数中进行初始化,并且初始化后值不得再改变。

  另外跟const不同的是,readonly 型的常量并不是隐式static 的,要想定义为类级别,必须手动定义其为 static 。那么既要其为  static 又要是 readonly 型只能在构造函数中初始化,那么当然必须要有静态构造函数才能完成任务!

 

3:readonly 型变量要求只许在构造函数中初始化,但要注意的一点是,只要是在构造函数中,readonly 型的常量,并非是一赋值就不能改了,而是可以多次改变。我觉得这一点有点不好!!!!!!如下的代码可以正常编译运行。。。。。

 

    class MyClass1
    {
        private readonly double PI;

 

        public MyClass1(double d)
        {
            PI = 3.1415926;
            PI = 3.11111;
            PI = d;
        }
        public void m1()
        {
            Console.WriteLine(PI);
        }
    }

 

4: const 跟 readonly 型常量既可以用在 class 中,也可以用在 struct 中,效果是一样的。

 

5: const 还可以用来修饰限定类的方法中的局部变量,而 readonly 不行!

 

6:const 型变量既然是一个 compile-time 变量,必须在编译时确定其值,那么它就只能容纳一些简单类型的变量,比如 int,float,double 之类的,但也不能说他只能存纳值类型的,因为 string 也可以适用。反之另一些系统定义的值类型的结构如: DateTime 型变量又不能用 const 来进行限制。如下面的代码,是编译通不过的:

 

class MyTestClass

{

  public const DateTime dt=new DateTime(2010,07,26,0,0,0);

  ...

}

 

也即是,凡是要用 new 关键字才能初始化的类型变量,均不能被设置为 const 。

 

但是 readonly 没有这个限制,因为它的初始化是在运行时的构造函数中进行的。

 

7:关于 readonly ,这里有个讨论也很有趣:关于 C# readonly 关键字的分析

亮点在评论。