前景提要:

  最近大家都在面试,讨论最多、最基础的问题,莫过于“关于const和readonly常见的笔试题剖析”,等等的大牛解析。我就是一个小菜,只不过,有点不敢苟同大牛的意见。废话少说,进入重点。

小斗大牛:

  关于const和readonly常见的笔试题剖析(http://www.cnblogs.com/wolf-sun/p/3599209.html

  

  上个帖子有牛回我,有些偏激,可能有点吧,但是我不想看到所谓大牛,误人子弟,而且还说的糊里糊涂!

  我只是一只小菜鸟!带着怀疑的精神,来探究问题!

  小批斗一下:

    批1:自定义含义

      

      大牛啊,您在给创造微软的定义吗?

        compile-time constant

        runtime constants

      MSDN已有明确翻译了

        编译时常数、运行时常数(这两个多么好理解啊!)

    批2:无意义的反编译,讲解

      

      这是干嘛,又引出一个关键字。我去!const→literal,readonly→initonly,这是啥意思呢!

 直奔主题:

  1、先看面试题:(增加一点复杂性)

  static readonly int A = C * D;

  static readonly int B = 10;

  const int C = 5;

  static readonly int D = B * C;

   static void Main(string[] args)

  {

  Console.WriteLine("{0},{1},{2},{3}", A, B, C, D);

  Console.ReadKey();

   }

  问:A、B、C、D数值是多少?

    答案:是A:0、B:10、C:5、D:50

  这就是答案了,想要面试成功,到这里就可以了。

  想要知道为啥,为什么?或者多加点工资?或者其他类似问题,怎么解决?

    那您还需要继续看下去。

  2、解释说明工具:ILSpy、Refelector、MSDN(个人理解,这里其实不用反编译,看看MSDN 你都能明白的。)

  3、正文开始

    先来一个扩展延深哈?

      面试时要是答案,您不太知道,你还可以剑走偏锋,

      3.1  你可以回答面试官,我什么时候用它,使用的场景。

        Readonly:场景1,数据库连接字段。

           场景2,定义一个人物类时,比如生日,性别,在构造一个人的时候就有的,不可能变的。当然现在可以直接就是一个只读属性。

        Const :一般是固定不变的,通用的,大家都知道的,const PI=3.14,这个我用的比较少,请大牛补充啊

      3.2  不走寻常路

        Console.WriteLine("{0},{1},{2},{3}", A, B, C, D);

        这句可以说,也是必须要说的,

          Console.WriteLine("{0},{1},{2},{3}", A.ToString(), B.ToString(), C.ToString(), D.ToString());

        看看,有啥不同,不就是多了ToString()吗?

        大牛最爱没事去反编译了,咱也要晋级大牛。去反编译吧!

          这里有详细记录了,毕竟不是本文主要内容:” C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析

简单说,就是发生了装箱,将int装入obj。效率的丢失。(这里值得你去反编译一下看看原理,装箱、拆箱是很影响效率滴。)

  4. 知识探究

    原本的英文(MSDN):

      Compile-time constant

      Runtime constant

个人认为你看看英文可能就会明白了,一个是编译时,一个是运行时(这两个不懂的话,看来你要好好复习一下大学课程,计算机系的应该都会知道的吧!)。

还用继续说下去吗?编译时常数,就是编译额过程中就确定了呗。运行时常数,运行中才去赋值,使用的东东。不管是编译时的还是运行时的变量、常量,所有的(那个全局、局部变量作用域就不说了啊)都会在编译的时候声明。不是赋值啊!

进入MSDN 搜索一下 :http://msdn.microsoft.com/zh-CN/

    Readonly定义:readonly 关键字是可以在字段上使用的修饰符。 readonly modifier, assignments to the fields introduced by the declaration can only occur as part of the declaration or in a constructor in the same class.' xml:space="preserve">当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中。

    Const定义:使用 const 关键字声明一个常量字段或局部常量。 此关键字指定字段或局部变量的值是常数,不能被修改。

    Static定义使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员 static   修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。

    小结一下:可以看出static与readonly、const没有一毛钱关系。而且在const中,也有明确的说明:不允许在常数声明中使用 static 修饰符。

        不论是在const,还是在readonly的MSDN中均有,一段醒目的明确的提示:

        

    看到这里,应该明白了吧

  5.还不懂?ok,服了您了,分析下代码

    程序编译:

      声明了所有字段,而且C=5了。这个是编译时的常量。你可以直接理解成C就是5,5就是C。

      此时运行时常量A=0,B=0,C=0。进行声明初始化。(int 默认值是0)

    程序运行(程序顺序执行,不用我说了吧):

      static readonly int A = C * D;// 这时没执行前A=0,C=5(编译时,就编译了,运行中改都改不了),D=0(还没被赋值呢啊,没到那句呢!),

      那就:执行吧;结果是A=5*0=0;

      static readonly int B = 10; //这句,没亮点,没内涵,过了吧,就是简单赋值操作

      const int C = 5;//这句得说,运行时,他都不执行,编译时就执行了,这下你不想着改了吧。可以自己调试一下试试。

      static readonly int D = B * C;// 这句也就简单了吧D=10*5=50;

    注意:在说明一下readonly只能在定义或者构造函数中赋值吧,其实,这就是微软就这么规定的,你记住这么用就行了。没有什么延深的,用途不是太多,一般场景以上也提到了。

    后议:即使反编译了:也就是换了一个称呼const→literal,readonly→initonly

    

      个人愚解:原来啊!framework那些大牛、开发工程师开发framework时,literal是内部使用名称,等到后来发布了,为了其他程序猿降低学习成本等,因为原来C++什么的都是const啊,所以C#对外发布也得叫这个。还是统一名称吧。Readonly也是就是换了一个名称啊。难道还有其他内涵?(请求大牛继续反编译光临指导啊!)

所以说大牛,以上是我不敢苟同的。您反编译了那么多,就告诉大家一个别名吗?

      还不如说Console.WriteLine()这里发生装箱,拆箱来的实惠些!(装箱拆箱:可以参看:C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析

C#面试-关于const和readonly(看了一个点赞很多的帖子有感而发!)的更多相关文章

  1. const 与 readonly知多少

    原文地址: http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html 尽管你写了很多年的C#的代码,但是可能当别人问到你cons ...

  2. [转]const 与 readonly知多少

    引自:http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html 尽管你写了很多年的C#的代码,但是可能当别人问到你const与r ...

  3. C# 关键字const与readonly的区别

    尽管你写了很多年的C#的代码,但是可能当别人问到你const与readonly的区别时候,还是会小小的愣一会吧~ 笔者也是在看欧立奇版的<.Net 程序员面试宝典>的时候,才发现自己长久以 ...

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

    引言 有那么几天没更新博客了,发现到了不得不写的地步,总是有那么个声音在强迫自己,虽然工作很累,但是有些东西不写出来,不能原谅自己.今天为什么总结这两个关键字的区别,总觉得这两个关键字的用法用的太习惯 ...

  5. 读书笔记:const和readonly、static readonly 那些事

    C#中表示不变的量(常量)的两种形式:const 和readonly const 是静态常量 readonly 是动态常量 严格的来讲:const 应该称为常量 而readonly 则应称为只读变量. ...

  6. const和readonly区别

    内容来源<<你必须知道的.NET>>(转载) 标题:什么才是不变:const和readonly 内容: const:用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌 ...

  7. const与readonly深度分析(.NET)

    前言 很多.NET的初学者对const和readonly的使用很模糊,本文就const和readonly做一下深度分析,包括: 1. const数据类型的优势 2. const数据类型的劣势 3. r ...

  8. C#基础知识系列八(const和readonly关键字)

    前言 不知道大家对const和readonly这两个关键字的区别有什么了解,原来自己之前还真不清楚它们到底是怎么回事,那么如果你也不是很清楚的话,可以一起来探讨一下.在了解这两个关键字的时候我们先来了 ...

  9. const和readonly差别

    我们都知道,const和static readonly的确非常像:通过类名而不是对象名进行訪问,在程序中仅仅读等等.在多数情况下能够混用.二者本质的差别在于,const的值是在编译期间确定的,因此仅仅 ...

随机推荐

  1. 2014年河南省第七届ACM大赛总结

    虽然大赛已经结束了两天,不过比赛的场景还是不断地在眼前回放,一遍遍,这次的比赛给了我很深刻的感悟还有教训. 刚开始比赛选择了贩卖武器那道题,也是全场到最后唯一没有被人做出来的一道题,策略的严重错误,大 ...

  2. Tomcat8 配置NIO

    conf/server.xml 打开:<Executor name="tomcatThreadPool" namePrefix="catalina-exec-&qu ...

  3. tl;drLegal ——开源软件license的搜索引擎

    TLDRLegal - Open Source Licenses Explained in Plain English可以很方便查询各个开源license的总结(能做什么,不能做什么),还能比较不同的 ...

  4. SpringMVC + Spring 3.2.14 + Hibernate 3.6.10 集成详解

    注:此文档只说明简单的框架集成,各个框架的高级特性未涉及,刚刚接触框架的新人可能需要参考其他资料. PS:本次练习所用jar包都能在此下载到:http://pan.baidu.com/s/1sjmgd ...

  5. JAAS authentication in Tomcat example--reference

    In this tutorial you will learn how to configure JAAS authentication in Tomcat using the HTTP Basic ...

  6. android开发之this.finish()的使用 分类: android 学习笔记 2015-07-18 19:05 30人阅读 评论(0) 收藏

    在一个Activity用完之后应该将之finish掉,但是,之前在学校里自己摸索着开发时并没有太注意这个问题,因为activity无论是否finish掉对功能的影响貌似都不是那么明显(这是读书时候的观 ...

  7. 修改android应用包名 分类: android 学习笔记 2015-07-16 22:48 4人阅读 评论(0) 收藏

    由于项目需要,要修改已经开发好的应用包名,这本身很简单,但是如果你没找到门道,可能会白白浪费许多时间. 修改包名有三个地方要改,这三个地方的修改一定要按顺序来,否则你可能会遇到许多不必要的麻烦. 1. ...

  8. Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历

    1. HashSet存储自定义对象并遍历 2. 代码示例: (1)Student类,如下: package cn.itcast_02; /** * @author Administrator * */ ...

  9. DataView操作DataTable

    1.DataView筛选数据 //假设有一个DataTable数据 DataTable dt = new DataTable(); //转成DefaultView DataView dv = dt.D ...

  10. Android -- 双击退出

    实现android双击后退键退出当前APP功能 实现该功能基本思路是, 1, 监听后退键 , 比较两次后退间隔 , 低于两秒则出发退出 2, 退出当前APP 我选择在基类中BaseActivity 中 ...