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 ...
随机推荐
- V8引擎实现标准ECMA-262(三)
推荐英文原址ECMA-262 3.构造函数 构造函数除了通过指定的模式创建对象以外,还有另外一个好处--它能够自动设置新创建对象的原型对象,这个原型对象存储在构造函数的Prototype属性中. 例如 ...
- Thrift源码分析(一)-- 基本概念
我所在的公司使用Thrift作为基础通信组件,相当一部分的RPC服务基于Thrift框架.公司的日UV在千万级别,Thrift很好地支持了高并发访问,并且Thrift相对简单地编程模型也提高了服务地开 ...
- 大数据技术之Flume
第1章 概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统.Flume基于流式架构,灵活简单. 1.2 Flume组成架构 ...
- 微信公众号系统在Linux下的部署操作
ps -ef | grep tomcat 查看tomcat进程
- hdu1080 LCS变形
dp[i][j]表示配对的最大值. dp[i-1][j]表示s1[i-1]与'-'配对. dp[i][j-1]表示s2[j-1]与'-'配对. dp[i-1][j-1]表示s1[i-1]与s2[j-1 ...
- sql函数的使用——系统函数
n sys_context 1)terminal:当前会话客户所对应的终端的标识符 2)lanuage:语言 3)db_name:当前数据库名称 4)nls_date_format:当前会话客户端所 ...
- LeetCode108 Convert Sorted Array to Binary Search Tree
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. (M ...
- CAD安装失败怎样卸载重新安装CAD,解决CAD安装失败的方法总结
技术帖:CAD没有按照正确方式卸载,导致CAD安装失败.楼主也查过网上关于如何解决CAD安装失败的一些文章,是说删除几个CAD文件和CAD软件注册表就可以解决CAD安装失败的问题,实际的情况并没有这么 ...
- SharpDX初学者教程第3部分:初始化DirectX
原文 http://www.johanfalk.eu/blog/sharpdx-beginners-tutorial-part-3-initializing-directx 在这部分中,我们将初始化D ...
- Myeclipse jdk的安装