首先不可否认,这些在面试上会经常被面试官问起,但是你回答的让面试官满意吗?当然如果你知道了这些原理,或许你就不

怕了。既然说到了原理,我们还是从MSDN说起。

一:值得推敲的几个地方

1.先来看看msdn上面对const是怎么说的,我们会看到。不能修改,编译时常量这些关键性信息。

Q:  const为什么不能被修改。

A:这个很简单,很多教科书上面都说,当编译器编译时,会将常量的值保存在该程序集的元数据中,下面我们做个实例

看一看。

①:新建一个projectA。

1 // ProjectA
2 public class TestClass
3 {
4     public const int CTRIP = int.MaxValue;
5 }

再建一个MainProject,引用下projectA。

using System;class Program
{static void Main(string[] args){Console.WriteLine(TestClass.CTRIP);Console.Read();}
}

然后我们把mainproject运行起来。

既然我把mainproject跑起来了,并且也引用了Test.dll,刚才也说了,编译的时候会把常量值保存在程序集的元数据中,那我们

就找一找,打开ILdasm.exe,并且Ctrl+M。

很可惜,我并没有找到Ctrip的符号,也没有找到int.MaxValue,也没有找到所谓的0x7fffffff,倒是找到了一个Assembly

的一些版本信息的元数据,那么这时候你可能会疑惑了,究竟const的值有没有保存到Assembly里面去呢?很简单的一个验证

方法就是,把Mainproject下面bin中的Test.dll删除掉,看看会有怎么样的奇迹发生。

这时候你会发现,既然test.dll都删除了。Demo.exe既然还能运行起来,说明const的值真的是写入到了Assembly里面

去了。不然值从哪里来的呢?

②: 聪明的你应该想到了,既然运行Demo.exe的时候不再加载Test.dll,而是直接从Demo的Assembly里面获取const值,

那是不是会有断层的事情发生,也就是版本不一致的情况,比如我已经修改了const值,然后把编译好的dll拷贝到Mainproject

的bin目录下,直接运行Demo.exe,会不会出现MainProject读不到修改后的const值呢?这里我将const改成 int.MinValue。

下面我们可以试试看。

1 // ProjectA
2 public class TestClass
3 {
4     public const int CTRIP = int.MinValue;
5 }

好了,看到上面的结果,就进一步佐证了刚才的说法,const确确实实是保存在Assembly的元数据中,这里还要顺便提示

一下,Enum本质上是const,所以它也存在我刚才说的断层的问题,说到这里,我想你对const的原理应该比较熟悉了,现

在我们来看看Question的问题。既然是元数据,那什么是元数据?“描述数据的数据” 叫做元数据,既然它是基础的描述性数

据,那么在定义好后是决对不能改变的,这个定义时也就是msdn说的编译时,是不是so easy呢?

Q:  const为什么要做成静态的,而不是做成实例的

A:  其实通过对第一个Question的分析,很多东西我们应该都会豁然开朗,因为存在断层的问题,那么最好的方法就是const的值

永远也不要变,这样就可以避免问题的发生,既然是永远都不变的东西,当然是跟着“类型”走比跟着“实例”走要好的多,你说

对不对,因为static是个小缓存,没必要new一下才产生。。。

Q: readonly字段只能在ctor中初始化吗?

A:这个问题蛮有意思的,我们知道readonly的意思就是只读字段的意思,我们知道一般的字段具有可读写的功能,

先还是看看编译器怎么说。

从编译器上可以看到,确实readonly的初始化还可以在“变量初始化”的时候进行初始化,那么这样说Question的答案

应该就是否定的,但是真的是如此吗?我们都知道有一个东西叫做“语法糖”,而且经常是编译器提供给我们用的,所以

真正的想看到发生了什么,只能用ILDasm.exe 穿透编译器,看看到底发生了什么。

从IL中可以看到,真的就是编译器的语法糖,本质上都是在ctor中初始化的,所以说,看问题千万不要看表面。

注:Stsfld 用来自计算堆栈的值替换静态字段的值。

const,readonly 这些你真的懂吗? 也许会被面试到哦。。。相关推荐

  1. const,readonly 这些你真的懂吗? 也许会被面试到哦。。。

    首先不可否认,这些在面试上会经常被面试官问起,但是你回答的让面试官满意吗?当然如果你知道了这些原理,或许你就不 怕了.既然说到了原理,我们还是从MSDN说起. 一:值得推敲的几个地方 1.先来看看ms ...

  2. 简述 C语言 有和 C++ 的基本区别,你真的懂吗?(新手面试必学)

    1.c和c++的头文件不同 c的头文件------#include c++的头文件---#include 2.输入输出不同 输入: int i = 10; c:scanf("%d" ...

  3. 面试官问你Java线程池--怎么样回答才能让面试官知道你真的懂了!

    一.引言 不管是Java面试还是Android面试,线程池都是面试官高频考察的点,那我们怎么回答,才能让面试官了解到我们是真的懂Java线程池了呢?这篇文章不涉及到线程池的使用和原理,如果你还不知道怎 ...

  4. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截...

    程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少.数据 ...

  5. 你真的懂TensorFlow吗?Tensor是神马?为什么还会Flow?

    本文的ipynb 格式见CSDN下载. 0维张量/标量 标量是一个数字 1维张量/向量 1维张量称为"向量". 2维张量 2维张量称为矩阵 3维张量 公用数据存储在张量 时间序列数 ...

  6. 示波器_你真的懂示波器嘛?面试中会用到的示波器知识

    示波器是电子工程师经常使用到的电子测量仪器,用途十分广泛,可将肉眼看不见的电信号变换成看得见的图像,便于人们研究各种电现象的变化过程.利用示波器能观察各种不同信号幅度随时间变化的波形曲线,还可以用它测 ...

  7. “三次握手,四次挥手”你真的懂吗?

    来源:码农桃花源 解读:"拼多多"被薅的问题出在哪儿?损失将如何买单? 之前有推过一篇不错的干货<TCP之三次握手四次挥手>,前几天有兄弟投稿,开始还以为是同一篇,后经 ...

  8. 【转】先说IEnumerable,我们每天用的foreach你真的懂它吗?

    [转]先说IEnumerable,我们每天用的foreach你真的懂它吗? 我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq ...

  9. 【原创】“三次握手,四次挥手”你真的懂吗?

    记得刚毕业找工作面试的时候,经常会被问到:你知道"3次握手,4次挥手"吗?这时候我会"胸有成竹"地"背诵"前期准备好的"答案&qu ...

最新文章

  1. VMware上实现LVS负载均衡(NAT)
  2. 图解 Kafka,一目了然!
  3. php 字符串替换函数,php字符串替换函数str-replace速度比preg-replace快
  4. Recom Airbnb embedding
  5. linux mysql 客户端编码设置_Windows、Linux系统下mysql编码设置方法_MySQL
  6. MySQL sql99语法介绍
  7. CodeForces - 1557D Ezzat and Grid(线段树+dp)
  8. java获取主机信息大全,网络编程:Java获取网络主机信息
  9. ElementUI dialog嵌套蒙层遮挡问题
  10. 1万亿次、10亿人、10亿张,科技给生活带来多少改变?
  11. 烂泥:团购网站的购买流程
  12. MQTT的学习研究(十三) IBM MQTTV3 简单发布订阅实例
  13. 力扣-1880(243 周赛) 检查某单词是否等于两单词之和
  14. Databinding在自定义ViewGroup中如何绑定view
  15. edius裁剪快捷键_Edius剪辑视频的两种方法
  16. 从来没有一种工作叫钱多、事少、离家近
  17. 第三方支付牌照(支付业务许可证)
  18. 国内主流虚拟化厂商之间比较
  19. 鸿蒙无极造化玉牒,上古十大至强神器,东皇钟只能排第四,另外七件你知道是哪七件吗...
  20. 散点数据的包络线获取(MATLAB)

热门文章

  1. 在C++程序中调用被C编译器编译后的函数为什么要加extern“C”?
  2. 3分钟通过日志定位bug,这个技能测试人必须会
  3. 使用 Python+Selenium + 第三方库实现的简单的 web 自动化测试框架 源码
  4. 江苏大学考研计算机录取率,报考数据分析—江苏大学
  5. Hibenate连接mysql错误_hibernate连接数据库问题,注意是表名的大小写
  6. 求cluster的质心坐标
  7. Boost Graph Library 快速入门
  8. MATLAB函数句柄
  9. 具有自适应空间强度约束和隶属度链接的鲁棒模糊c均值聚类算法
  10. 【matlab】线性空间滤波器的实现