这是个非常简单但是又为很多人不知晓的东西,说出来很俗,但不说不一定绝大多数的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代码看下就明白了。

看到没,我没说谎吧。
说到这儿,我突然记起来一道面试题,我一个朋友去面试人家问他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。
本文出自 “碧雪青天” 博客,请务必保留此出处http://oversky.blog.51cto.com/1026601/1381293
浅谈readonly和const,布布扣,bubuko.com
浅谈readonly和const
原文:http://oversky.blog.51cto.com/1026601/1381293