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

本文深入探讨了C#中const与readonly关键字的区别,通过实际案例和中间语言(IL)对比,详细解释了静态与动态常量的概念及应用场景。

引言

有那么几天没更新博客了,发现到了不得不写的地步,总是有那么个声音在强迫自己,虽然工作很累,但是有些东西不写出来,不能原谅自己。今天为什么总结这两个关键字的区别,总觉得这两个关键字的用法用的太习惯了,没想过为什么这么用,就好比为什么一直用右手拿筷子,这么习惯。为什么我要用右手拿筷子,为什么不用左手呢?突然你就这么干了,发现你和周边很不协调,而且还夹不了菜。const和readonly也一样,习惯了,一直这样用,也就没追究过。突然被那么一问,还真说不出来个一二,今天就细细的研究下,到底这东东是啥玩意儿?网上虽然很多这方面的内容,虽然也看过,但是那毕竟是别人总结的,自己没动手实践一下,就觉得那不是自己的。实践才能记得更深刻,理解的更深。

常量

静态常量:指编译器在编译时会对常量进行解析,并将常量的值替换成初始化的那个值。

动态常量:在运行的那一刻获取值,编译器编译期间将其标识为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化。

readonly和const

const修饰的常量为静态常量,而readonly修饰的常量为动态常量。

如何区别呢?

const修饰的常量在声明的时候必须初始化,readonly修饰的常量则可以延迟到构造函数中初始化。

const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值,readonly修饰的常量则延迟到运行的时候。

const修饰的常量注重的是效率,readonly修饰的常量注重灵活。

const修饰的常量没有内存的消耗,readonly因为需要保存常量,所以有内存消耗。

const只能修饰基元类型。枚举类或者字符串类型,readonly却没有这个限制。

题一:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Wolfy.ConstReadonly
 8 {
 9     class Program
10     {
11         static readonly int A = 2 * B;
12         static readonly int B = 4;
13         static void Main(string[] args)
14         {
15             Console.WriteLine("A={0},B={1}", A, B);
16             Console.Read();
17         }
18     }
19 }

那么A=?,B=?,知道的先忍着,看一下到底是多少:

为什么会这样呢?ILspy看一下,到底是咋回事?

通过这也看不到什么不同啊,不要急,慢慢来,对比一下就知道不同了。

说明一下静态只构字段:

改为下面的就可以了:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Wolfy.ConstReadonly
 8 {
 9     class Person
10     {
11         public static readonly int C;
12          static Person()
13         {
14             C = 3;
15         }
16     }
17 }

写这个主要是为了说明上面图中红色字描述的静态只构字段。

那么我们把readonly改为const试一试。

题二:

这个题,主要是考察static能不能和const关键字同时修饰一个变量,编译发现报错。

题三:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Wolfy.ConstReadonly
 8 {
 9     class Program
10     {
11         const int A = 2 * B;
12         const int B = 4;
13         static void Main(string[] args)
14         {
15             Console.WriteLine("A={0},B={1}", A, B);
16             Console.Read();
17         }
18     }
19 }

那么A=?,B=?,知道的,也别急,先忍着,看一下到底是多少:

那么这个面试题的IL是什么样子的呢?这里为了方便对比,将readonly的IL部分贴到一起,方便对比。

const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值,readonly修饰的常量则延迟到运行的时候。

通过IL的对比,对他们的区别有了更深的认识了吧。希望对你有所帮助。

题四:

 

这个考察的主要是const修饰的常量必须初始化。

总结

东西很基础,只是想研究个究竟的时候,通过IL看了一下,虽然基础,如果通过IL一探究竟的话,还是收获颇深的,如果对你有所帮助不妨推荐一下。谢谢!

参考文章:http://blog.csdn.net/shellching/article/details/8516789

转载于:https://www.cnblogs.com/wolf-sun/p/3599209.html

内容概要:本文研究基于纳什博弈交替方向乘子法(ADMM)的多微网主体能源共享模型,旨在实现多个微网之间的高效能源交互与优化调度。通过建立非合作博弈模型,各微网作为独立决策主体在满足自身需求的前提下追求成本最小化,利用ADMM算法实现分布式求解,确保隐私保护与计算效率。文中详细阐述了模型构建、博弈均衡分析、ADMM收敛性处理及仿真验证过程,并提供完整的Matlab代码实现,复现了SCI高水平论文的核心成果。; 适合人群:具备一定电力系统优化背景、博弈论基础知识及Matlab编程能力的研究生、科研人员或从事能源互联网、微电网调度相关工作的工程师;适合希望深入理解分布式优化算法在能源共享中应用的研究者。; 使用场景及目标:①掌握纳什博弈在多主体能源系统中的建模方法;②理解ADMM算法在分布式优化中的实现机制与收敛特性;③复现并拓展高水平SCI论文中的能源共享优化模型;④为微电网调度、能源市场机制设计等课题提供算法支持与代码参考。; 阅读建议:建议结合文档提供的Matlab代码逐段调试运行,深入理解变量设置、迭代流程与收敛判断逻辑;同时可延伸至其他分布式优化场景(如虚拟电厂、综合能源系统)进行模型迁移与改进。【SCI复现】基于纳什博弈ADMM的多微网主体能源共享研究(Matlab代码实现)
内容概要:本文介绍了一种基于变分模态分解(VMD)与麻雀搜索算法(SSA)优化的最小二乘支持向量机(LSSVM)相结合的多变量电力负荷预测模型,该模型通过Matlab代码实现。首先利用VMD对原始负荷数据进行分解,降低序列复杂度并提取不同频率特征;随后采用SSA优化LSSVM的关键参数,提升预测精度;最后将优化后的LSSVM用于各模态分量的预测并叠加得到最终负荷预测结果。该方法有效提高了负荷预测的准确性与稳定性,适用于多变量输入场景下的短期负荷预测任务。; 适合人群:具备一定电力系统背景Matlab编程能力的高校研究生、科研【VMD-SSA-LSSVM】基于变分模态分解与麻雀优化Lssvm的负荷预测【多变量】(Matlab代码实现)人员及从事能源预测相关工作的工程技术人员;熟悉机器学习算法并希望将其应用于实际负荷预测问题的研究者。; 使用场景及目标:①解决传统负荷预测模型精度不足、易受噪声干扰的问题;②实现对多影响因素(如温度、历史负荷等)耦合作用下的电力负荷高精度预测;③为智能电网调度、能源管理及电力市场决策提供可靠的数据支撑; 阅读建议:建议读者结合提供的Matlab代码逐步复现整个预测流程,重点关注VMD参数设置、SSA优化机制与LSSVM建模环节,同时可尝试替换数据集或引入其他优化算法进行对比实验,以深入掌握该混合预测模型的设计思路与调参技巧。
内容概要:本文围绕无槽永磁电机的磁场解析问题展开,指出传统的原始场公式(RFF)在不同电机几何形状下可能引入显著误差,为此提出一种更为精确的解析解法,并通过Matlab代码实现验证。该方法旨在提高无槽永磁电机磁场计算的准确性,适用于需要高精度建模的研究与工程应用场景。文中还提及多个相关科研方向技术实现,涵盖无人机仿真控制、电力系统优化、路径规划、新能源系统调度、负荷与可再生能源预测等多个前沿领域,均配有Matlab或Python代码实现支持。; 适合人群:具备一定电机理论基础编程能力,从事电气工程、自动化、【无槽永磁电机解】磁场问题的直接场解,称为原始场公式(RFF),在整个无槽永磁电机领域中可能导致显著的误差,这些误差随着机器几何形状的变化而显著不同,提出了一种达到解析解(Matlab代码实现)新能源系统、智能控制等领域研究的科研人员及研究生;熟悉Matlab/Simulink或Python的开发人员。; 使用场景及目标:①改进无槽永磁电机磁场计算精度,替代存在误差的RFF方法;②为电机设计、控制系统仿真、高性能驱动开发提供可靠模型基础;③拓展至多物理场耦合分析与优化设计。; 阅读建议:建议结合提供的Matlab代码深入理解解析解的推导过程,对比RFF与新方法在不同几何参数下的误差表现,强化理论与实践结合;同时可参考文中列出的其他研究主题及相关代码资源,拓展科研思路与技术实现路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值