C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量)
Const和Readonly的异同:
相同点:
const和readonly的值一旦初始化则都不再可以改写;
不同点:
const定义时必须指定初始值,而readonly定义时可以不进行初始化(MS建议在定义时初始值),同时也可以在构造函数内指定初始值
const隐含static,不可以再写static const;readonly则不默认static,如需要可以写static readonly;
const是编译期静态解析的常量(因此其表达式必须在编译时就可以求值,内存无消耗);readonly则是运行期动态解析的常量(内存因保存常量,所以有消耗);
const既可用来修饰类中的成员,也可修饰函数体内的局部变量;readonly只可以用于修饰类中的成员.
const 对于引用类型的常数,可能的值只能是 string 和 null 。
readonly 可以是任何类型
const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。
const是编译时常量,readonly是运行时常量;cosnt较高效,readonly较灵活。在应用上以static readonly代替const,以平衡const在灵活性上的不足,
例:
Readonly是否可以替换成const
1. static readonly MyClass myins = new MyClass();
2. static readonly MyClass myins = null;
3. static readonly B = 10; static readonly A = B * 20;
4. static readonly int [] constIntArray = new int[] {1, 2, 3};
1:不可以 换成const。new操作符是需要执行构造函数的,所以无法在编译期间确定
2:可以换成const。我们也看到,引用类型的常量 (除了String)只能是Null。
3:可以换成const。我们可以在编译期间很明确的说,A等于200。
4:不可以换成 const 道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。