2018-9-3-C#-const-和-readonly-有什么区别
title | author | date | CreateTime | categories |
---|---|---|---|---|
C# const 和 readonly 有什么区别
|
lindexi
|
2018-9-3 16:52:7 +0800
|
2018-07-27 08:24:50 +0800
|
C#
|
在写常量的时候,是选择使用 const 还是 static readonly 是一个让人难以决定的问题,本文告诉大家这两个方法的区别。
如果一个类有静态字段,会如何初始化
可以使用的方法有两个,第一个方法就是直接在属性定义时写创建,第二个方法就是在构造创建,请看下面代码
private static Test _test = new Test();
private static Test _test;
static Demo()
{
_test = new Test();
}
再来思考下面的问题
请看下面两个代码有什么区别
const string str = "xxxxx";
static readonly string str = "xxxxx";
const 编译时常量
static readonly 运行时常量
修改两常量的值,生成新的Test.dll,然后运行Demo.exe(不编译)。
在不重新编译运行的时候,从上面的输出可以看到,使用const的值是不会修改,具体原因是因为 const 会被内联到代码
如写了下面的代码
public void DeawelTurkisHotarwoWefudaybem()
{
var str = "德熙" + Foo;
} private const string Foo = "逗";
这时使用 Resharper 的 ILViewer ,在 Resharper 的 Resharper->Windows->ILViewer 打开,重新编译一下项目,把光标放在var str = "德熙" + Foo
就可以看到类似下面代码的 IL 显示的是拼接了"德熙" + Foo
的字符串
.method public hidebysig instance void
DeawelTurkisHotarwoWefudaybem() cil managed
{
.maxstack 1
.locals init (
[0] string str
)
// [8 9 - 8 10]
IL_0000: nop
// [9 13 - 9 34]
IL_0001: ldstr "德熙逗"
IL_0006: stloc.0 // str
// [10 9 - 10 10]
IL_0007: ret
}
如果是方法内的常量也是会被内联代码,请看下面代码
public void DeawelTurkisHotarwoWefudaybem()
{
const int n = 100;
var foo = n;
}
这时从 IL 可以创建的是下面的代码,定义的 n
是不存在的
.method public hidebysig instance void
DeawelTurkisHotarwoWefudaybem() cil managed
{
.maxstack 1
.locals init (
[0] int32 foo
) // [9 9 - 9 10]
IL_0000: nop // [11 13 - 11 25]
IL_0001: ldc.i4.s 100 // 0x64
IL_0003: stloc.0 // foo // [12 9 - 12 10]
IL_0004: ret }
上面代码的IL_0001
就是把一个int压入栈,压入的值是 100 ,也就是原来的定义的 n
就被去掉了,直接使用n的值
如果dll被其他100个工程引用的话,
每次修改 Test 的 const 变量后一定要重新 build 这100个工程,
不然的话这些工程里的const值就不会更新。
1.编译时常量更改时,引用该常量的程序集必须重新编译,
才能获取已更新的值。
2.运行时常量更改时,引用该常量的程序集不必重新编译,直接运行便可获得已更新的值。
对于隐式转换,如果是 const 支持隐式转换,如果是static readonly,不支持
(1)const常量在编译时解析;而static readonly常量在运行时解析。
(2)const常量必须在定义时初始化;而static readonly常量可以在定义时初始化,也可以在构造函数中初始化;
(3)非常确定不会改变的常量值可以用const,必须写在函数体内的常量需要用const,需要被attributes用到的常量应该用const。
(4)常量需要被客户端引用,且可能会改变,应该用static readonly。
2018-9-3-C#-const-和-readonly-有什么区别的更多相关文章
- C# const 和 readonly 有什么区别
在写常量的时候,是选择使用 const 还是 static readonly 是一个让人难以决定的问题,本文告诉大家这两个方法的区别 如果一个类有静态字段,会如何初始化 可以使用的方法有两个,第一个方 ...
- C#基础知识七之const和readonly关键字
前言 不知道大家对const和readonly关键字两者的区别了解多少,如果你也不是很清楚的话,那就一起来探讨吧!探讨之前我们先来了解静态常量和动态常量. 静态常量 所谓静态常量就是在编译期间会对变量 ...
- const 与 readonly知多少
原文地址: http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html 尽管你写了很多年的C#的代码,但是可能当别人问到你cons ...
- [c#基础]关于const和readonly常见的笔试题剖析
引言 有那么几天没更新博客了,发现到了不得不写的地步,总是有那么个声音在强迫自己,虽然工作很累,但是有些东西不写出来,不能原谅自己.今天为什么总结这两个关键字的区别,总觉得这两个关键字的用法用的太习惯 ...
- const 和 readonly
const 和 readonly 的异同 Const readonly 字面意 不变常量,不可修改 只读操作,不可写 初始化 必须在声明的同时赋值 可在声明和构造方法中进行赋值 所属关系 类.即sta ...
- C#夯实基础系列之const与readonly
一.const与readonly的争议 你一定写过const,也一定用过readonly,但说起两者的区别,并说出何时用const,何时用readonly,你是否能清晰有条理地说出个一二三 ...
- 读书笔记:const和readonly、static readonly 那些事
C#中表示不变的量(常量)的两种形式:const 和readonly const 是静态常量 readonly 是动态常量 严格的来讲:const 应该称为常量 而readonly 则应称为只读变量. ...
- Const(常量)与readonly(只读)的区别
const与readonly定义的值都不能更改,但它们到底有哪些异同点呢? Const ² Const是常量的意思,其定义的变量只能读取不能更改,且只能在定义时初始化,不能在构造函数与其它属性与方法中 ...
- const和readonly区别
内容来源<<你必须知道的.NET>>(转载) 标题:什么才是不变:const和readonly 内容: const:用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌 ...
- [转]const 与 readonly知多少
引自:http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html 尽管你写了很多年的C#的代码,但是可能当别人问到你const与r ...
随机推荐
- iOS block 用法
1.定义Block /* 回传void ,参数也是void 的block*/ void (^blockReturningVoidWithVoidArgument)( void ); /* 回传整数,两 ...
- PHPCMS快速建站系列之添加单页模版
单页模板命名:page_xxx.html 以page_开头 在模版所在目录的config.php中添加配置项 'page_xxx.html' => '单网页', 也可以不在config中配置,不 ...
- mysqldump导出表结构或者表数据
加-d参数代表只导表结构,不加此参数则代表导出结构以及表数据,> 代表录入某一文件,若为>>则表示将内容追加到某文件末尾. -- 导出数据库为dbname的表结构 mysqldump ...
- Myeclipse自定义注释
1.设置模板 Windows—Preference—Java—Code Style—Code Templates 图中, Configure generated code and comments中的 ...
- KiCad 5.1.4 无法覆铜?
KiCad 5.1.4 无法覆铜? 群里有小伙伴发现焊盘无法覆铜,只能靠手工连接. 这就奇怪了,正常情况不会出现的这种现象的. 分析了很多可能,比较间隙太小,有试着调过,但还是连接不上. 把封装的所有 ...
- OSS跨同城3AZ重磅发布,构造全面数据保护体系
点击订阅新品发布会! 新产品.新版本.新技术.新功能.价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布 OSS跨同城3AZ重磅发布 2019年7月3日15时,OSS跨同城3AZ重磅发布 ...
- 2019-7-22-Roslyn-获得-sln-文件所在的文件夹
title author date CreateTime categories Roslyn 获得 sln 文件所在的文件夹 lindexi 2019-07-22 08:57:14 +0800 201 ...
- hihocoder1994 树与落叶 DFS+前缀和+二分
DFS找到节点删除的时间,删除的时间其实就是子树的最长链,然后给每个点打一个时间戳,然后求每个时间点对应删除的节点的个数,对于1-max_time时间戳求一个前缀和,然后二分找到和m距离最近的那一天 ...
- 2018-2-13-windows-10预览版升级win10-7月29-10240.16384
title author date CreateTime categories windows 10预览版升级win10 7月29 10240.16384 lindexi 2018-2-13 17:2 ...
- video 获取第一帧的图片作为封面
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...