首页/新闻资讯/正文详情

C# 系列教程_5 常量 系统精讲(新手友好・详尽版)

发布时间:2026/11/4 6:55:28 来源:云帆数科 栏目:资讯中心
C# 系列教程_5 常量 系统精讲(新手友好・详尽版)
前置回顾变量variable内存命名空间值可以修改。常量constant命名空间值一旦定义永远不能修改。C# 里面有两种最核心的 “只读” 成员很多新手会混淆const——编译期常量真正意义上的常量readonly——运行期只读字段不是常量是只读成员还有 C# 7.0 新增的readonly struct只读结构体以及get只读属性后面一并对比。核心一句话区分 ✅const编译的时候就把值写死在代码里编译期确定。 ✅readonly运行时创建对象的时候赋值一次之后不能修改。学习路线const 常量基础语法、示例、机理const 使用规则、能放哪些类型、不能放哪些类型readonly 只读字段对比 const静态 readonly、实例 readonlyreadonly struct 只读结构体拓展常量 / 只读字段 内存模型使用场景怎么选什么时候用 const什么时候用 readonly新手高频坑 代码练习1 const 编译期常量const constant1.1 基础语法const 数据类型 常量名 常量值;规范常量命名一般全部大写单词下划线分隔MAX_COUNT行业通用规范。示例 1最简单 const 常量using System; namespace ConstDemo { class Program { // 定义常量写在类里面 public const double PI 3.1415926; static void Main(string[] args) { // 读取常量 double r 5; double area PI * r * r; Console.WriteLine(圆面积 area); // PI 999; // 编译报错常量不能赋值修改 } } }机理拆解非常关键public const double PI 3.1415926;const 是编译期常量。编译器在编译代码的时候直接把代码中所有 PI 替换成字面量 3.1415926。编译完成后程序集里面不再存在一个叫 PI 的变量代码里所有 PI 都被直接替换成数字。读取PI * r * r编译后等价于3.1415926 * r * r尝试写PI 999;编译器直接拦截常量不允许赋值编译失败程序无法运行。本质const 不是内存里一块可以读写的存储空间是代码文本替换。1.2 const 可以写在什么位置✅ 可以写类内部最常用方法内部局部常量C# 支持❌ 不能写在属性里面不能写在方法参数上。示例 2方法内局部 conststatic void Main(string[] args) { const int MAX_AGE 120; int userAge 20; if(userAge MAX_AGE) { Console.WriteLine(年龄合法); } // MAX_AGE 200; //编译报错 }局部常量只在当前{}代码块内有效作用域和局部变量一致。1.3 const 允许的数据类型重点考点const只能是编译期就能确定值的类型基础值类型bool, char, byte, short, int, long, float, double, decimalstring字符串null引用类型常量只能是 null❌不能用 const 修饰 class、数组、自定义 struct 对象。原因new 创建对象是运行时操作编译阶段拿不到对象实例。错误示例// const Student s new Student(); //编译报错不能new作为const值string 特例const string GREET Hello; // ✅合法 const string EMPTY null; // ✅合法1.4 const 隐式是 staticconst默认自带static特性不需要手动写 static。 访问方式类名.常量名不需要 new 对象。class MathHelper { public const double PI 3.1415926; } static void Main() { Console.WriteLine(MathHelper.PI); //直接类名访问不用new MathHelper }就算你写static const编译器也允许但属于多余代码不推荐。1.5 const 的优缺点✅ 优点编译期直接文本替换没有运行时开销性能最高防止代码中 “魔法数字”散落在代码里的裸数字可读性差统一管理修改只需要改一处全部自动更新。❌ 缺点编译期固定如果是跨项目引用修改常量后依赖项目必须重新编译只能存放编译期常量不能放运行时计算出来的值。魔法数字举例 差代码if(score 60)60 就是魔法数字 好代码const int PASS_SCORE 60; if(score PASS_SCORE)含义一目了然后期改及格线只需要修改常量。2 readonly 只读字段运行期只读经常和 const 对比⚠️ 重点readonly不是常量是实例 / 静态字段只是只读。readonly 字段是分配在内存的运行时才有值编译期不会做文本替换。语法readonly 类型 字段名;规则只能在声明时赋值或者构造函数里面赋值对象构造完成之后任何地方都不能再次修改示例 1实例 readonly属于对象实例using System; namespace ReadOnlyDemo { class Book { // 只读实例字段 public readonly string BookName; public readonly double Price; // 构造函数创建对象的时候可以给readonly赋值 public Book(string name, double price) { BookName name; Price price; } } class Program { static void Main(string[] args) { Book b1 new Book(C#入门, 59.9); Console.WriteLine(${b1.BookName}, {b1.Price}); // b1.Price 99; //编译报错构造完成后readonly字段禁止修改 } } }机理拆解BookName、Price是实例只读字段存在堆内存对象内部new Book()创建对象时进入构造函数给这两个字段赋值构造函数执行完毕对象创建完成这两个字段就锁死不能再写运行时读取内存中的值编译器不会做文本替换。和 const 巨大区别 const 编译期替换readonly 是堆内存字段运行时读取内存。示例 2static readonly 静态只读字段属于类class Config { //静态只读字段属于类不属于对象 public static readonly DateTime BuildTime DateTime.Now; } static void Main() { Console.WriteLine(Config.BuildTime); // Config.BuildTime DateTime.Now; //报错不能修改 }这个场景不能用 constDateTime.Now是程序运行那一刻才能获取的时间编译期不知道所以只能用static readonly。 ✅ 核心使用场景值需要运行时计算、读取但是之后永不修改。const vs static readonly 对比表项目conststatic readonly类型编译期常量运行期只读静态字段赋值时机声明时必须赋值声明处 / 静态构造函数赋值本质编译代码文本替换无内存变量内存中分配字段运行读取支持类型仅限编译期常量int/string 等任意类型包括对象、DateTime跨程序集更新修改后所有引用项目要重新编译修改后不用重编译依赖项目性能略高无内存读取略低运行读取内存一句话记忆编译期就确定死的值用 const运行时才能拿到的值用 static readonly。3 readonly struct 只读结构体拓展readonly struct整个结构体全部只读结构体内部字段都不能修改。readonly struct Point { public readonly int X; public readonly int Y; public Point(int x, int y) { X x; Y y; } }作用防止结构体实例被意外修改值类型优化场景使用。新手初学暂时用得少。4 只读属性get-only 自动属性另一种只读方案C# 可以用属性只写 get不写 set实现只读class Student { public string Name { get; } //只读自动属性只能在构造函数赋值 public Student(string name) { Name name; } }本质编译器自动生成一个 readonly 后台字段。现在写项目很多时候优先用只读属性代替 readonly 字段封装性更好。5 常量的作用与实际价值消除魔法数字提高代码可读性// 不好 if(score 90) Console.WriteLine(优秀); // 好 const int EXCELLENT_SCORE 90; if(score EXCELLENT_SCORE) Console.WriteLine(优秀);读代码一眼看懂 90 代表什么后期修改只改常量一处。统一维护多处使用同一个数值避免多处修改漏改防止意外修改编译器强制保护任何地方尝试修改直接编译报错保护关键参数。6 新手高频坑汇总const 必须声明的时候直接赋值不能等到构造函数赋值readonly 可以在构造函数赋值。const int a; //编译报错const必须初始化const 不能放 new 对象不能放 DateTime.Now 这类运行时值这类只能用 static readonly。const 默认 static不需要 new 对象访问实例 readonly 必须 new 对象。const 是编译期文本替换跨项目引用时修改 const别的项目不重新编译不会生效。readonly 只是字段本身不能重新赋值如果 readonly 里面存的是引用类型对象对象内部属性仍然可以修改非常经典大坑大坑示例readonly 引用类型class Person { public string Name; } class Test { public readonly Person P new Person(); } static void Main() { Test t new Test(); // t.P new Person(); //报错不能修改P这个字段不能换对象 t.P.Name 张三; //✅合法对象里面的数据可以修改 }机理readonly 限制的是变量 / 字段保存的地址不能替换不是锁定堆里面对象内容。 想要对象内部也不可修改需要类内部自己做只读属性。

相关推荐

免费 LLM API 实战清单:零预算调用大模型,国内三家平台注册与接入笔记
免费 LLM API 实战清单:零预算调用大模型,国内三家平台注册与接入笔记

免费 LLM API 实战清单:零预算调用大模型,国内三家平台注册与接入笔记 【免费下载链接】awesome-free-llm-apis List of Permanent Free LLM API (API Keys) 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-free-llm-apis 没有 API 预算、… · 2026/11/4 6:54:28

国产模型周用量破 10 万亿 tokens:Nex 这类开源新军正挤进 DeepSeek 与混元的牌桌
国产模型周用量破 10 万亿 tokens:Nex 这类开源新军正挤进 DeepSeek 与混元的牌桌

国产模型周用量破 10 万亿 tokens:Nex 这类开源新军正挤进 DeepSeek 与混元的牌桌 【免费下载链接】Nex-N2.5-Pro 项目地址: https://ai.gitcode.com/hf_mirrors/nex-agi/Nex-N2.5-Pro 如果说前两年国产大模型的竞争还是"参数发布会",… · 2026/11/4 6:54:28

Python后端权限系统01:先画边界,再写登录——采购申请中的身份、动作与资源
Python后端权限系统01:先画边界,再写登录——采购申请中的身份、动作与资源

Python后端权限系统01:先画边界,再写登录——采购申请中的身份、动作与资源 周五下午,工程部门的 Alice 提交了一笔设备采购。负责销售部门的 Carol 复制了审批链接,页面里却出现了“同意采购”按钮;另一家公司的 Mall… · 2026/11/4 6:54:28

2026年AI工程化十大热门岗位:推理加速、Agent开发与端侧部署技能全解析
2026年AI工程化十大热门岗位:推理加速、Agent开发与端侧部署技能全解析

1. 从招聘需求倒推:这10个岗位为什么会在2026年集中爆发 过去大半年,我一直在跟踪国内外AI团队的招聘JD变化,也帮几个朋友做过内推和简历诊断。一个很明显的感受是:2024年大家还在抢“大模型训练工程师”,到了2025年下… · 2026/11/4 8:58:36

人事管理系统数据库设计:六表建模与状态/历史分离避坑
人事管理系统数据库设计:六表建模与状态/历史分离避坑

简介:这份文档面向高校计算机与信息管理专业学生,以人事管理系统后台数据库为设计题目,覆盖从需求分析到数据库实施、再到报告撰写的完整流程,适合正在完成数据库课程设计或准备相关实验的人对照参考。压缩包内只有1个doc文件&… · 2026/11/4 8:58:36

网络安全人才需求激增:现状、驱动力与职业发展
网络安全人才需求激增:现状、驱动力与职业发展

1. 网络安全行业的人才供需现状最近两年,一个有趣的现象正在就业市场悄然发生:网络安全专业的应届毕业生正在成为各大企业争相抢夺的"香饽饽"。某985高校信息安全专业的辅导员告诉我,他们今年毕业的学生平均每人手握3-5个offer&… · 2026/11/4 8:58:36

DSP283xx驱动AD7606八通道同步采样时序与实现
DSP283xx驱动AD7606八通道同步采样时序与实现

简介:面向TI TMS320F283xx系列DSP开发者,提供在CCS环境下驱动与控制AD7606高速16位ADC的工程参考,适用于工业采集、实时信号处理等需要多通道同步采样的场景。压缩包共100个文件、约429KB,以C源文件与头文件为核心,配合… · 2026/11/4 8:58:36

AI招聘新趋势:Agent工程化与推理加速等10个新兴岗位解析
AI招聘新趋势:Agent工程化与推理加速等10个新兴岗位解析

1. 从热搜词里读出的行业信号:为什么这10个岗位正在冒头过去大半年,我一直在跟踪AI招聘市场的变化。有个很直观的感受:前两年大家聊AI岗位,翻来覆去就是"算法工程师""数据标注""大模型训练"这几个词… · 2026/11/4 8:58:36

多城市货物运输优化:路径规划与资源调度实践
多城市货物运输优化:路径规划与资源调度实践

1. 项目背景与核心需求城市间货物运输系统是物流行业的核心基础设施,也是供应链管理的关键环节。这个系列项目聚焦于多城市间的货物运输优化问题,通过三个递进阶段解决运输网络中的路径规划、资源调度和成本控制等核心痛点。在实际物流运营中&#xff0c… · 2026/11/4 8:57:34

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码