这是个非常简单但是又为很多人不知晓的东西,说出来很俗,但不说不一定绝大多数的programer能够clear。
    下面就对这两个进行下区别说明:    

   Readonly:
    ①readonly叫做只读,它标识字段只能被读操作。
    自然可以被读,那么必然有个地方给它赋值。
    ②readonly的赋值只能在构造器重完成,构造器包括类型构造器和实例构造器,响应的字段也要用static和不使用static来修饰。
    ③readonly可以被static关键字修饰,变成静态只读字段。

   Const:
   ①const叫做常量,所谓的常量就是说一旦初始定义以后再也不能被修改。
   ②const逻辑上是静态的,所以不能和static连用。

    比较抽象的话就看这个Demo:

   class Readonlyandconst
   {
       //常量字段
       private const string testField = "这只是一个用于测试常量的字段!";
       //静态只读只能在类型构造器中被初始化
       private static readonly string readonlyField="我是初始值";
       //类型构造器
       static  Readonlyandconst()
       {
           readonlyField = "改变静态只读字段的值";
       }
       private string instanceField = "实例字段";
       //实例构造器
       public Readonlyandconst()
       {
           instanceField = "改变实例只读字段的值。";
       }
   }

   我在其前面说了const逻辑上是static的,我们可以借助IL代码看下就明白了。
浅谈readonly和const_readonly const
看到没,我没说谎吧。

说到这儿,我突然记起来一道面试题,我一个朋友去面试人家问他abstract可以不可以和static连用,当时他懵了,不过凭直觉还是给了一个不能。但是后来问我是我说不能时,他继续问我为什么,其实如果知道了静态类最终会被编译成abstract的类,就会知道abstract和static不能联合使用了。其实,很多时候都被微软的一些设计所折服,就拿那几关键字来说,如果我问vitrual、abstract、static可不可以组合使用,vitrual类可不可被abstract类基础,或者反之。

     首先,我们可以这么理解,在CLR中我们知道在构建一个实例对象时首先要做的是加载类型对象,类型对象有类型构造器来完成。而这些类型实例对象我们可以叫他们原型或者模板。微软在将static类编译时编译成了abstract的,所以我们可以肯定abstract不可能和static连用,那么virtual和static呢,答案是否定的,为什么?我们不做验证,virtual是虚拟的,是会被继承者改写的,那么好,如果说我们运行static和virtual联合使用,那就会出现一个大问题!static修饰的成员我叫她为类型成员,什么意思?也就是说这个成员为所有这个类型实例所共享,那完了,你一改其他实例对象全都改了,这绝对是不允许的,所有我也不做验证,virtual和static绝对不能联合使用,OK结论已然明显,static和abstract以及virtual都能不组合使用。

      但是virtual和abstract可以有继承关系吗?我也不想验证了,给个结论吧,自己悟出来的,如果有误,请看官给我斧正。这个结论就是出来密闭类和私有类、静态类、最终类不能被继承外,其他的引用类型都是可以继承的。

       这里提一个问,突然想到的,static 修饰的类是什么类型?提示关键字class。