《Effective C#》Item 2:定义常量的两种方法

ControlItems.zip 上次上传的大家说有问题,是我没演示怎么使用items属性,我进行了改进, 大家可以看看类似datagrid的列属性items是怎么实现的。代码注视完整,开发平台vs2005,代码语言C#。 立即下载

在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。

 

对于静态常量(Compile-time constant),它的书写方式如下:

public const int MAX_VALUE = 10;

为什么称它为静态常量呢,因为如上声明可以按照如下理解(注意:如下书写是错误的,会出编译错误,这里只是为了方便说明)。

public static const int MAX_VALUE = 10;

用const定义的常量,对于所有类对象而言都是一样的,因此需要像访问静态成员那样去访问const定义的常量,而用对象的成员方式去访问会出变异错误。此外,对于静态常量的访问在编译的时候,是用常量的值去替换常量,例如:

int nValue = MAX_VALUE;

这句在编译之后,和如下这句所产生的中间语言代码是一样的。

int nValue = 10;

 

不过,在用const来定义常量的时候,在类型上有很多限制。首先,此类型必须属于值类型或者String类型,同时此类型的初始化不能通过new来完成,因此一些用struct定义的值类型常量也不能用const来定义。

 

相对于const而言,用readonly来定义常量要灵活的多,它的书写方式如下:

public readonly int MAX_VALUE = 10;

为什么称为动态变量,因为系统要为readonly所定义的常量分配空间,即和类的其他成员一样拥有独立的空间。此外,readonly所定义的常量除了在定义的时候可以设定常量值外,还可以在类的构造函数中进行设定。由于readonly所定义的常量相当于类的成员,因此使用const来定义常量所受到的类型限制,在使用readonly去定义的时候全部消失,即可以用readonly去定义任何类型的常量。

 

综合上面所述,至于对比两者之间的区别具体如下。

 

静态常量(Compile-time constant)

动态常量(Runtime constant)

定义

声明的同时要设置常量值。

声明的时候可以不需要进行设置常量值,可以在类的构造函数中进行设置。

类型限制

首先类型必须属于值类型范围,且其值不能通过new来进行设置。

没有限制,可以用它定义任何类型的常量。

对于类对象而言

对于所有类的对象而言,常量的值是一样的。

对于类的不同对象而言,常量的值可以是不一样的。

内存消耗

无。

要分配内存,保存常量实体。

综述

性能要略高,无内存开销,但是限制颇多,不灵活。

灵活,方便,但是性能略低,且有内存开销。

 

对于在定义常量的时候,到底是用const来定义还是readonly来定义,我以前为了追求性能,因此尽量用const来定义。但是在此书中,提到了一个关于使用const会产生潜在的bug。就是在程序中使用DLL类库某个类的静态常量时,如果在类库中修改静态常量的值,其它接口没有发生变化,一般来说,程序调用端是不需要重新编译,直接执行就可以调用新的类库。不过就是在此情况下,会产生潜在的bug。这是由于静态常量在编译的时候,是用它的值去替换常量,因此在调用端的程序也是这样进行替换的。

例如:在类库中定义了一个静态常量,如下:

public const int MAX_VALUE = 10;

那么对于程序中调用此静态常量这段代码,在编译后产生的中间语言代码中,是用10来进行替换,即使用静态常量的地方,改为10了。

那么当类库的静态变量发生变化后,例如:

public const int MAX_VALUE = 15;

那么对于调用端程序是可以在没有重新编译的情况下进行运行,不过此时程序的中间语言代码对应于静态变量的值是10,而不是新类库中的15。因此这样产生的不一致,程序会引发潜在的bug。解决此类问题的方法,就是调用端程序在更新类库之后重新编译一下,即生成新的中间语言代码。

 

对于如上在const定义常量时所存在的潜在bug,在用readonly定义常量时是不会发生的。因为readonly定义的常量类似于类的成员,因此在访问的时候需要根据具体常量地址来访问,从而避免此类bug。

 

鉴于此,本书建议用readonly来替换const去定义常量。

【Unity学习笔记】事件系统EventSystem 1.EventSystem物体 第一次在Unity中创建UI元素时,总会自动生成一个EventSystem物体,它包含三个组件:Transform、EventSystem、Standalone Input Module。如果我们把它删除了,会发现UI上的事件(比如点击、拖拽)将不会被检测到。没错,它就是用来处理UI相关的事件的。 1.1 EventSystem组件 EventSystem基于输入给物体发送事件,它在整个事件系统中扮演的主要角色是: 1.管理被选中的物体 2.管理正在使用的Input Modu 阅读详情

相关推荐

五大经典遥感数据集对比:LoveDA、Potsdam、Toronto、Vaihingen、Massachusetts Roads选哪个?

本文深度对比了LoveDA、Potsdam、Vaihingen、Toronto和Massachusetts Roads五大经典遥感数据集。针对城市监测、道路提取、土地分类等不同任务,从分辨率、标注质量、数据规模及场景多样性等核心维度进行分析,为研究者根据项目目标、硬件条件与应用场景选择最合适的遥感数据集提供决策指南。

weixin_29057065的博客 236

C#泛型概述(四)

休息了两天,又开始上班了,最后一天班再努力继续学习,在上一章我讲述了泛型类和常规类的区别,这次我们详细再讲讲泛型类和怎么去使用泛型类。 四、创建泛型类(二叉树举例) 泛型类的创建很简单,只要在类的后面加一个<T>就可以了,.net里面也提供了很多现成的泛型类,在System.Collections.Generic的命名空间中,我们也可以自定义自己的泛型类,但在此之前,我们还是...

weixin_40875853的博客 294

从解压到编译:手把手带你用TeXstudio搞定第一篇ACM LaTeX论文

本文详细指导如何使用TeXstudio从解压ACM LaTeX模板到成功编译第一篇学术论文的全过程。涵盖环境准备、模板配置、TeXstudio设置及常见问题排查,特别针对ACM会议论文格式要求,帮助学术新人快速掌握LaTeX写作技巧。

weixin_30655569的博客 254

C#中的static、readonly与const的比较

C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。 工作原理     readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。     c

High_Mount的专栏 2万+

基于PINN的一个简单的求解偏微分方程实例

本人是做化工模拟的一名学生,最近在学习PINN(Physics-Informed Neural Networks,物理信息神经网络)对管道动力学进行建模研究,PINN由于其对机理与数据的良好兼顾性非常热门,本文是作者对PINN入门研究过程的一个练手小题目,main code也是作者代码是基于pytorch2.6.0写的,发上来供各位参考,欢迎研究管道动力学和PINN的小伙伴一起讨论~

weixin_64491760的博客 1739

Telegram 担保交易系统搭建指南:安全可靠的交易流程实现

本文介绍了基于Telegram Bot API搭建担保交易系统的完整方案。该系统通过第三方资金托管机制解决买卖双方信任问题,支持"付款后发货"和"收货后放款"的交易流程。文章详细阐述了系统架构设计,包括Telegram Bot交互层、后端业务逻辑层、数据库层和支付接口层。核心实现步骤涵盖:1)订单创建模块处理交易信息;2)支付处理模块集成Stripe Escrow实现资金托管;3)确认收货模块完成资金划转。系统采用PostgreSQL存储交易数据,并通过FastAPI

jingpide9527的博客 1945

item系列内置函数

点的方式操作属性与attr相关: 中括号的方式操作属性与item系列相关 __ setitem __ __ getitem __ __ delitem __

weixin_43760098的博客 908

BitLocker加密盘解密实战:从隐藏分区到密钥恢复的全过程

本文深入探讨了BitLocker加密盘在密钥丢失或遗忘情况下的解密实战方法。文章系统性地介绍了从理解加密机制、制作取证镜像,到深度扫描隐藏分区、分析内存转储寻找密钥残留,最终利用恢复密钥解锁加密卷的全过程。重点剖析了非标准恢复路径,为数据恢复和数字取证工作提供了专业的技术框架和实战思路。

weixin_29268385的博客 331

C#关键字之const详解

一、const关键字限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。 1.用于修改字段或局部变量的声明,表示指定的字段或局部变量的值是常数,不能被修改。 2.常数声明的类型指定声明引入的成员类型。常数表达式必须产生具有目标类型或可隐式转换为目标类型的值。 3.常数表达式是在编译时可被完全计算的表达式。因此不能从一个变量中提取值来初始化常量。 (如果const

Carey 2万+

从零到一构建一个智能爬虫 Agent 完整教程

本文将打造一个具备自主决策、动态解析、反反爬、持久化能力的智能爬虫 Agent

数据知道的博客 4792

华为云计算——FusionCompute创建虚拟机

华为云计算——FusionCompute创建虚拟机

jks212454的博客 3675

c#语言基础笔记

C# @TOC一、简介 .NET简介(dotnet),是Microsoft新一代多语言的开发平台 C#,是Microsoft专为.NET推出的高级编程语言 Mono是支持在其他操作系统下开发.NET程序的框架 CLS公共语言规范:定义了.NET平台上运行的语言所支持的规范,用以避免不同语言特性产生的错误,实现语言间互操作。 CLR公共语言运行库,负责内存分配、垃圾收集、安全检查等工作。 源...

weixin_38009144的博客 454

Win10系统怎么打开Microsoft帐户?Win10系统打开Microsoft的帐户方法

也被加入了越来越多的功能,我们在使用电脑的时候,很对用户会打开Micorsofy账户功能,搜索个人邮件信息,照片等等,还能将个人的数据备份到账户内,那要怎么打开账户呢,下面带给大家方法。以上就是小编给大家整理的win10系统打开Microsoft帐户的具体操作方法,方法简单易懂,有需要的朋友可以看一看,希望这篇教程对大家有所帮助。5、最后我们将“Microsoft帐户”选项下方的开关按钮向右滑动将其打开,如下图所示,这样就成功打开wMicrosoft帐户功能了。我们在窗口左侧点击“设置”选项即可。

2401_88800025的博客 278

[转载]《Effective C#》Item 2:定义常量的两种方法

《Effective C#》Item 2:定义常量的两种方法《Effective C#》Item 2:定义常量的两种方法 在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),...

congji3817的博客 115

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

转:《Effective C#》Item 2:定义常量的两种方法

转:http://writeblog.youkuaiyun.com/PostEdit.aspx 在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。 对于静态常量(Compile-time constant),它的书写方式如下:

flyskylf的专栏 750

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Effective C# Item 2: Prefer readonly to const

Effective C# Item 2:Prefer readonly to const C#拥有两种不同的常量:静态常量(compile-time constants)和动态常量(runtime constants)。它们有不同的特性,错误的使用不仅会损失效率,还可能造成错误。相比之下,静态常量在速度上会稍稍快一些,但是灵活性却比动态常量差很多。 //静态常量publi...

aijinyao5713的博客 151

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Effective C#: Item 2 Prefer readonly to const

Effective C#: Item 2 Prefer readonly to const Item 2: 定义常量时,优先使用readonly,而不是const 在C#中,有两种类型的常量,compile-time和runtime。它们的性质是差别很大的。正确的选择对于你程序的稳定性和性能都有很大的影响。Compile-time常量速度稍稍快一点,但灵活性...

weixin_30951389的博客 145

Effective C# Item2:运行时常量(readonly)优于编译时常量(const)

C#中的常量分为两种类型:运行时常量和编译时常量,运行时常量使用readonly修饰,编译时常量使用const修饰。     运行时常量和编译时常量有以下区别: 运行时常量是在程序运行时才会进行解析,而编译时常量是在程序进行编译时,就进行解析了。从生成的IL来看,运行时常量在IL中依然会指向你声明的变量;而编译时常量在IL中已经变为具体的值了。编译时常量只能应用于基本类型,包括数字和字符串

尹自强.DoSomething() 482

《Effective C#》Item 14:使用构造函数初始化语句

在写程序的时候,往往会出现为一个类型提供不同场景的构造函数,可能大多构造函数比较相似,而C#中又不允许缺省参数,因此构造函数的编写无疑是一个重复工作。但是使用Copy和Paste来完成构造函数的编写,有时候很难达到统一,尤其是当成员发生变化的时候。因此比较常见的替换方法就是为构造函数提供一个统一的成员函数来完成初始化工作。例如:    public class MyClass    {

愚翁专栏 9114

Item 2: Prefer readonly to const(Effective C#)

  Compile-time constants are limited to numbers and strings. Read-onlyvalues are also constants, in that they cannot be modified after the constructorhas executed.  You can use readonly values for i...

weixin_30823833的博客 103

[转载]《Effective C#》Item 14:使用构造函数初始化语句

《Effective C#》Item 14:使用构造函数初始化语句《Effective C#》Item 14:使用构造函数初始化语句 在写程序的时候,往往会出现为一个类型提供不同场景的构造函数,可能大多构造函数比较相...

congji3817的博客 145

Effective C# Item14: Utilize Constructor Chaining

Effective C# Item14: Utilize Constructor Chaining 当我们写类的构造函数的时候经常会有许多种重载版本,它们完成的工作有一部分是重复的。许多开发者往往是先写第一个构造函数,然后拷贝粘贴它们到其他的构造函数当中去。我们应当停止这种做法。当我们发现许多重载的构造函数都包含有一些普遍的算法时,我们应当将这些逻辑集合到构造函数中,形成构...

aijinyao5713的博客 135

Effective C# Chapter 1 小结

经过了将近一个月的时间,终于完成了第一章的学习 + 翻译。第一章的内容是比较基础的,大部分内容可以看成是在讲如何养成良好的编程习惯。除了GetHashCode()那一节之外,其他的内容都是经常会用到的编程技巧。分辨引用和值类型、4种Equals()之间的关系等等也是.Net的基础知识。 还有对于Item 11: Prefer foreach Loops 中fore...

aijinyao5713的博客 146

Effective C# Item7:将值类型尽可能实现为具有常量性和原子性的类型

在创建值类型实例时,应该尽可能将其实现为具有常量性和原子性,所谓常量性,就是说对象在创建后就不会被改变,类似于我们在程序中定义的常量,这种形式的值类型只要被创建好后,就可以认为它的状态一直是不变的,这样它就是线程安全的。     原子性是指值类型中某些具有关联关系的字段,例如生日和年龄,年龄是根据生日计算得来的,如果对象的使用方只是修改年龄,而不修改生日,那么这样的结果显然是错误的。具有原子性的

尹自强.DoSomething() 446
上一篇: 《Effective C#》Item 1:用属性来访问类的私有成员
下一篇: 《Effective C#》Item 3:使用as和is操作符来做类型转换
Knight94
博客等级 码龄25年 1013粉丝 87原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值