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-有什么区别的更多相关文章

  1. C# const 和 readonly 有什么区别

    在写常量的时候,是选择使用 const 还是 static readonly 是一个让人难以决定的问题,本文告诉大家这两个方法的区别 如果一个类有静态字段,会如何初始化 可以使用的方法有两个,第一个方 ...

  2. C#基础知识七之const和readonly关键字

    前言 不知道大家对const和readonly关键字两者的区别了解多少,如果你也不是很清楚的话,那就一起来探讨吧!探讨之前我们先来了解静态常量和动态常量. 静态常量 所谓静态常量就是在编译期间会对变量 ...

  3. const 与 readonly知多少

    原文地址: http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html 尽管你写了很多年的C#的代码,但是可能当别人问到你cons ...

  4. [c#基础]关于const和readonly常见的笔试题剖析

    引言 有那么几天没更新博客了,发现到了不得不写的地步,总是有那么个声音在强迫自己,虽然工作很累,但是有些东西不写出来,不能原谅自己.今天为什么总结这两个关键字的区别,总觉得这两个关键字的用法用的太习惯 ...

  5. const 和 readonly

    const 和 readonly 的异同 Const readonly 字面意 不变常量,不可修改 只读操作,不可写 初始化 必须在声明的同时赋值 可在声明和构造方法中进行赋值 所属关系 类.即sta ...

  6. C#夯实基础系列之const与readonly

    一.const与readonly的争议       你一定写过const,也一定用过readonly,但说起两者的区别,并说出何时用const,何时用readonly,你是否能清晰有条理地说出个一二三 ...

  7. 读书笔记:const和readonly、static readonly 那些事

    C#中表示不变的量(常量)的两种形式:const 和readonly const 是静态常量 readonly 是动态常量 严格的来讲:const 应该称为常量 而readonly 则应称为只读变量. ...

  8. Const(常量)与readonly(只读)的区别

    const与readonly定义的值都不能更改,但它们到底有哪些异同点呢? Const ² Const是常量的意思,其定义的变量只能读取不能更改,且只能在定义时初始化,不能在构造函数与其它属性与方法中 ...

  9. const和readonly区别

    内容来源<<你必须知道的.NET>>(转载) 标题:什么才是不变:const和readonly 内容: const:用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌 ...

  10. [转]const 与 readonly知多少

    引自:http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html 尽管你写了很多年的C#的代码,但是可能当别人问到你const与r ...

随机推荐

  1. 数据库lib7第2, 3题(创建索引和触发器)

    2. 分别为上述建立的表格建立适当的索引,请描述建立索引的过程(可以截图或者写SQL).其中,要求对SPJ标中的SNo, PNo字段各建立一个索引,为(PNo, JNo)的组合建立一个索引.请问,SN ...

  2. thinkphp php审核后返回信息给html

    1.die("<script>alert('至少选择一个收款方式!');history.back(-1);</script>");

  3. 原生js复习1.0

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. spring data jpa 原生sql 别名字段无法注入

    开发四年只会写业务代码,分布式高并发都不会还做程序员?->>>    在使用entityManager.createNativeQuery(sql,User.class)这个方法时, ...

  5. mySQL start service失败终极解决办法

    start service失败  原因是电脑没删干净.具体1.先卸载2.计算机“搜索”所有MySQL文件  注意隐藏文件也可以搜索出来全部删除.3.清除注册表MySQL及子项.4.防火墙的问题 不要勾 ...

  6. 2018-7-21-win10-uwp-调用-Microsoft.Windows.Photos_8wekyb3d8bbwe-应用

    title author date CreateTime categories win10 uwp 调用 Microsoft.Windows.Photos_8wekyb3d8bbwe 应用 linde ...

  7. saltStack_Pillar

    Pillar是Salt非常重要的一个组件,它用于给特定的minion定义任何你需要的数据,这些数据可以被Salt的其他组件使用.这里可以看出Pillar的一个特点,Pillar数据是与特定minion ...

  8. 第三期 行为规划——11.在C ++中实现第二个成本函数

    在大多数情况下,单一成本函数不足以产生复杂的车辆行为.在这个测验中,我们希望您在C ++中实现更多的成本函数.我们稍后会在本课中使用这两个C ++成本函数.这个测验的目标是创建一个成本函数,使车辆在最 ...

  9. php 第三方登录总结OAuth协议

  10. Wood Processing牛客第十场 斜率优化DP

    卧槽我感觉写的是对的,但是就是样例都过不了...留坑 #include<iostream> #include<stdio.h> #include<string.h> ...