前言

在c# 的世界中,在初学的时候,可能很难区分readonly 和 const,两者都是不可修改。

看到这两个单词,我们想的是,最多他们的区别也不会太大。然后事实却出乎我们的意料。

正文

这两个声明变量根本是不同时期的变量。

readonly 是 运行时常量,而const 是编译的时候的变量。

对于常量,C#里有两个不同的版本:运行时常量和编译时常量。

因为他们有不同的表现行为,所以当你使用不当时,将会损伤程序性能或者出现错误。

两害相权取其轻,当我们不得不选择一个的时候,我们宁可选择一个运行慢一点但正确的那一个,而不是运行快一点但有错误的那个。

基于这个理由,你应该选择运行时常量而不是编译时常量

你可以用关键字readonly来声明(declare)一个运行时常量,编译时常量是用关键字const声明的。

//Compile time constant:

public cocnst int _Millennium = 2000;

//Runtime constant:

public static readonly int _ThisYear = 2007;//(译注:原文为2004)

编译时常量与运行时常量不同之处表现在如何对他们的访问上。

一个编译时常量会被目标代码中的值直接取代。下面的代码:

if(myDateTime.Year == _Millennium)

会与下面写的代码编译成完全相同的IL代码:

if(myDateTime.Year == 2000)

运行时常量的值是在运行时确定的。当你引用一个只读常量时(read-only)IL会为你引用一个运行时常量的变量,而不是直接使用该值。

编译器常量只能用来表示内置的整数、浮点数、枚举、字符串。

因此你想new 一个对象是不可能实现的。

如:

const DateTime classCreateTime =new DateTime(2000,1,1,0,0,0);

不是const 不想为你实现,而是做不到。

好的,那我们到这里总结一下:const 和 readonly 的不同。

1.一个readonly 是运行时候的常量,而const 是编译时候的常量。

这一点毋容置疑,const 运行的速率更快。

2.在readonly中可以实例化常量,二const 则不能,也就是只能是一些静态常量。

这里说明了readonly比const慢,那么是否可以用const的地方,就用const呢?毕竟人家更快。

答案却是相反的,const是为了使性能达到极致,但是const 会出现一些错误,如果用程序的速率去换稳健性的话,这并不是一笔好的买卖。

为什么说const 稳健性下降呢?

程序集Config:

public class UsefulValues{
public static readonly int StartValue=5;
public const int EndValue=10;
}

现在有另外一个程序集Application来引用配置:

for(int i=UserfulValues.StartValue;i<EndValue.EndValue;i++)
{
//打印出来
}

第一次运行的时候,得到的结果是:5-9

现在只修改config集,将EndValue改为100。

第二次得到的结果为:5-9

这是为什么呢?因为Application 没有从新编译,那么因为是const,里面写死了10。

但是这只能说是const的一个特性,而不是说其缺点。

比如说一些版本号,有3个程序集。applicationA,ApplicationB,ApplicationC。

这3个程序集,要引用一个Config集的一个版本,第一个版本发布的时候是1.0。

那么编译完就都是1.0了,那么动态打补丁的时候,applicationA 现在修改了,是2.0。

而其他ApplicationB,ApplicationC 就还是1.0。

这样使用该程序的人就知道ApplicationB,ApplicationC 使用的自己是1.0版本,这样方便开发人员找出问题。

注:在一些大型客户端中更新的时候,不会去把每一个程序集都编译一遍。

总结

const 用来声明在编译就确定的值,其他的用readonly。

c# 优化代码的一些规则——const 和 readonly[二]的更多相关文章

  1. c# 优化代码的一些规则——优先隐式类型[一]

    前言 说到底就是优先使用var,这个关键字,在c# 3.0中出现了. 首先要确认几点,一个就是var 是静态变量,而不是动态变量,也就是说使用var 你是不必去担心性能问题得, 百度百科: 1)静态存 ...

  2. c# 优化代码的一些规则——使用is或as和强制类型转换的区别[三]

    前言 使用as和强制类型转换的时候的区别是否仅仅是代码形式上的区别. 答案是肯定不是的. 正文 看两段代码: object o = Factory.GetObject(); Student stude ...

  3. c# 优化代码的一些规则——字符串使用优化[四]

    前言 在我们的程序中,经常使用到字符串,字符串的写法非常多,但是有一个问题就是我们写的字符串是否合适呢? 正文 内插符 介绍一个东西叫做内插字符,如下: static void Main(string ...

  4. PL/SQL 美化器&规则解释&优化代码

    前言 PLSQL有非常强大的自定义设置功能,比如美化文件规则, 使用者可以自行定义编辑规则,以便更好的优化SQL语句,增加可读性. 例如以下的部分代码,又长,分段不好,空格太多,结构散乱,还没有注释. ...

  5. Webpack 4教程:为什么要优化代码

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://wanago.io/2018/07/30/webpack-4-course-part ...

  6. [好文翻译]WEB前端性能优化的14条规则

    作为一个半前端工程师,而且只会写点HTML5和CSS3的“假”前端工程师,为了能更好地理解一下前端的花花世界,最近拜读了<高性能网站建设指南>一书,对作者提出的前端性能优化的14个规则获益 ...

  7. Yahoo网站性能优化的34条规则

    摘自:http://blog.chinaunix.net/uid/20714478/cid-74195-list-1.html Yahoo网站性能优化的34条规则 1.尽量减少HTTP请求次数 终端用 ...

  8. 小程序的优化代码的分析Promise方法

    代码优化,这里通过了wx.request请求轮播图的API,通过result结果里面的data数据我们可以看到massage里面装着我们的数据 通过图片可以用看到swiperList返回的三个元素的数 ...

  9. 为duilib的MenuDemo增加消息响应,优化代码和显示效果

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/38253297 第一部分 我在前一段时间研究了怎么制作duilib的菜单, ...

随机推荐

  1. FreeRTOS-Qemu 实现三任务同步通信机制以及API信息

    1. 本次作业的考察要点: 作业地址:github.com/HustWolfzzb-Git/GCC/GDB/QEMU等工具的使用.FreeRTOS多任务同步和通信机制的掌握. 2. 编程作业: 在gi ...

  2. bfs—迷宫问题—poj3984

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20591   Accepted: 12050 http://poj ...

  3. python3yupython2的差别

    1.长整型 # python2中才有长整型概念,python3中只有整形一说 # 定义方法:变量名=整数+l (小写L) #python2环境下 >>> a=123456789123 ...

  4. xenomai内核解析之xenomai的组成结构

    @ 目录 一.xenomai 3 二.xenomai3 结构 这是第二篇笔记. 一.xenomai 3 从xenomai3开始支持两种方式构建linux实时系统,分别是cobalt 和 mercury ...

  5. Java——IO流超详细总结

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 在初学Java时,I ...

  6. 支付宝小程序云开发serverless----获取用户的user_id

    支付宝小程序云开发serverless----获取用户的user_id 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 开通云调 ...

  7. C. The Big Race

    \(给出数n,a,b\) \(在[1,n]区间内随机选数,选出的数被a,b除后同余的概率\) \(这题的精度问题真的是烦炸了~\) \(设最小公倍数lcm=a*b/gcd(a,b)\) \(所以在区间 ...

  8. [LiDAR数据模拟]系列(2) HELIOS的TLS点云模拟流程

    关键词:地基激光雷达 点云模拟 XML文件 作者:李二 日期:07/05/2020 - 08/05/2020 我目前仅仅使用了TLS模式进行模拟,所以先讲一下TLS的模拟经验. ALS和MLS的模拟, ...

  9. asp.net core + entity framework core 多数据库类型支持实战

    根据微软官方文档的说法,有两种方法可以实现在一个app中同时适应多种不同类型的数据库,并且全部支持migrations操作.其一,使用两个dbcontext:其二,修改migration文件,添加特定 ...

  10. [hdu4714 Tree2cycle]树形DP

    题意:给一棵树,删边和加边的代价都为1,求把树变成一个圈所花的最小代价. 思路:对原树进行删边操作,直到将原树分成若干条链,然后通过在链之间添加边形成圈,由于删边和加边一一对应,且最后需要额外一条边连 ...