[c#基础]关于const和readonly常见的笔试题剖析-阿里云开发者社区

开发者社区> shy丶gril> 正文

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

简介:
+关注继续查看

引言

有那么几天没更新博客了,发现到了不得不写的地步,总是有那么个声音在强迫自己,虽然工作很累,但是有些东西不写出来,不能原谅自己。今天为什么总结这两个关键字的区别,总觉得这两个关键字的用法用的太习惯了,没想过为什么这么用,就好比为什么一直用右手拿筷子,这么习惯。为什么我要用右手拿筷子,为什么不用左手呢?突然你就这么干了,发现你和周边很不协调,而且还夹不了菜。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

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MongoDB数据库操作和程序基础文档
转自:http://blog.csdn.net/xto/archive/2010/03/22/5403855.aspx 数据库常用操作命令 Bin\mongod run 启动数据库服务端。 bin\mongod.exe --dbpath d:\data\mongo 启动数据库服务端并且将数据库目录设定在该地址下。
796 0
Html和JS基础
1.body:bgcolor,background(背景图片),bgproperities=fixed(图片水印),text(正文颜色)。 2.hr:水平分割线,正文标题自动换行了 3.
585 0
155个JavaScript基础问题(31-40)
155个JavaScript基础问题(31-40)
38 0
Java 发送qq邮件基础和封装
前文摘自 菜鸟教程 :http://www.runoob.com/java/java-sending-email.html 使用Java应用程序发送 E-mail 十分简单,但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) 。
1452 0
+关注
1878
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载