在C#中const 和 readonly都是常量的修饰符,那么两者有什么区别?
class Test{
const int num = 5;
readonly int num2=5;
}
上面这段代码我们并没有发现什么不同之处,现在我们先从初始化上面下下功夫.
class Test{
const int num;
readonly int num2=5;
}
而这段代码就会报错,因为这是常量是不能运行再次赋值的,如果没有初始化就会报错
class Test{
const int num=5;
readonly int num2;
}
这段代码却不会报错,明明都是常量为什么不赋值却不报错?这里就是const | readonly区别,const是静态常量,而readonly是动态常量,const的初始化是在编译时期就会被初始化,readonly是动态常量,是在运行时才赋值的,所以编译时期不会报错,因此readonly的初始化可以推迟到构造方法里执行。
class Test{
int a =5;
const int num= a+5;
readonly int num2;
}
这段代码是会报错的,前面我是说了const是静态常量是在编译时期就会存在的是数据,但是如果是变量就能不鞥呢确定数据的值所以会报错,如果是readonly就可以,因为是运行时所以没有问题,说了那么多来测试下。
class Test{
public void Show(){
readonly int num = num2*5;
readonly int num2 = 5;
Console.WriteLine("num:{0},num2{1}",num,num2);
}
}
如果你的答案是:25,5 那么说明你还是不懂,其实答案是:0,和5因为是执行时才初始化,一开始都是0,还没有执行到num2所以是0*5还是0,num2是5所以是这个答案,
如果想要25,5这样写class Test{
public void Show(){
const int num = num2*5;
const int num2 = 5;
Console.WriteLine("num:{0},num2{1}",num,num2);
}
}
因为是编译时期就会被确定的值所以这里是num2是5,5*5就是25.\
总结:1.const、readonly定义的常量,指定初始值后(包括在构造函数内指定的初始值) 将不可更改,可读不可写;
2.const定义时必须指定初始值,而readonly定义时可以不进行初始化同时也可以在构造函数内指定初始值。
3.const和static readonly定义的常量是静态的,只能由类直接访问;而readonly定义的常量是非静态 的,只能由实例对象访问;
4.const是编译时常量,readonly是运行时常量;cosnt较高效,readonly较灵活。在应用上以readonly代替const,以平衡const在灵活性上的不足,
同时克服编译器优化cosnt性能,所带来的程序集引用不一致问题;