const是静态常量,const是编译时常量;readonly是动态常量,是运行时常量,const较高效,readonly较灵活。
1.访问方式
const默认是静态的,只能由类型来访问,不能与static同时使用;
readonly默认是非静态的,由实例对象来访问,可以显示使用static定义为静态成员;
2.修饰内容
const只能应用在值类型和string类型上,其他引用类型常量只能定义为null,数组和结构体不能被声明为const常量,string类型可以被声明为常量,因为string类型的字符串恒定特性,使得string的值具有只读特性;
readonly只读字段,可以使任意类型,但是Readonly赋值引用类型以后,引用本身不可以改变,但是引用所指向的实例的值是可以改变的;
3.初始化
const必须在字段声明时初始化;
readonly可以在声明时,或者构造函数中进行初始化,不同的构造函数可以为readonly常量实现不同的初始值;在构造方法中,我们可以多次对Readonly赋值;
static readonly的初始化,必须在定义时,或者静态无参构造函数中进行;
4.定义区别
const可以定义字段和局部变量;而readonly则只能定义字段;
public class Test
{
//声明字段
private const string name = "sssss";
public readonly int age = 24;
private static readonly string name1 = "ssssss";
public Test(int a)
{
age = 25;//readonly多次赋值
age = 26;
//声明局部变量
const string name = "132456";
}
}
5.语法外的最大区别
Const的变量是CLR特殊处理嵌入在IL代码中,编译时就加载好,不依赖外部dll(编译好可以都可以删除这个外部dll哈哈)。所以在程序集更新时Const容易产生版本不一致的情况。
Readonly的变量是在运行时加载,需请求加载dll,每次都获取最新的值,依赖外部dll,不会出现版本不一致问题,更灵活,但是效率相较于Const就低了一些。