关于const和readonly的一些用法与区别

来源:http://www.manew.com/blog-242626-43358.html

①只读变量readonly分静态只读变量和非静态只读变量,非静态的需要实例化对象进行访问

 

②只读变量可以进行再赋值,但只有初始化,在构造器中这两次,实例化完毕后就无法再赋值

 

静态只读变量只有在静态构造函数中再次赋值,非静态只读变量只有在普通构造函数中赋值

 

④const常量自带static,无法用static修饰符,但也受到访问修饰符影响,例如:public,private

 

⑤const常量只能在初始化定义时赋一次值,其他任何情况都无法赋值,只能使用

以下是论证:

关于这两者关键字,最开始其实我也是一直有些混乱,最近在网上查了些,然后自己总结了下,我尽量写详细些吧,虽然语文一直在及格线上徘徊

 
首先我们来了解一下这两个关键字的几个形态,const是常量,readonly是只读
为学习方便,新建一个控制台实例,名字随意。
然后创建一个测试类testClass
先定义几个变量以示例:

public static readonly string a="a";
//这是一个静态的只读变量a,并且赋予初值"a"
public const string b = "b";
//这是一个常量b并赋予初值"b",注意,const关键字不能加static,但默认就已经是静态的字段,不过还是会受到访问级别的限制,这里我给它添加一个public
public readonly string c = "d";
//非静态只读变量c,赋予初值"c",与a变量区分以作其他功能测试
 
接下来正式开始测试
首先测试静态的只读变量a

然后我们可以看出,直接在构造函数里面给a赋值将会失败,提示:无法对静态只读字段赋值(静态构造函数或变量初始值中除外)

不过我们可以直接使用这个变量a

在Main函数中直接赋值也会报这个错。

然后我们删除,直接打印testClass.a

(MD,这个蛮牛水印太恶心了,完全看不到了嘛……)

由于水印,可能看不清,具体是这么写的:Console.WriteLine("a=" + testClass.a);

然后根据提示我们来在静态构造函数中进行再赋值:

n是我额外加的一个判断静态构造函数执行次数的计数变量,暂时不管

之后再次测试结果:

大致应该懂了readonly的基础用法,也就是在初始化的时候可以赋一次初值外,在静态构造函数中也可以执行赋值

然后是测试const,经测试,只能在定义const时进行赋值,其他任何情况都无法更改const的值

最后,测试非静态只读变量c

图中可知,对于readonly,也必须得满足面向对象的写法,非静态变量依然得实例化一个对象来"."出来使用

不过也得到一个信息就是,readonly可以在对象构造函数中进行再赋值,接下来看看这个赋值是否有效(c在定义时赋的是"d"):

原文地址:https://www.cnblogs.com/LiTZen/p/11837349.html