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

 

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

怕了。既然说到了原理,我们还是从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 用来自计算堆栈的值替换静态字段的值。

时间: 2024-09-20 21:36:42

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

你真的懂病毒式营销吗

本文讲的是你真的懂病毒式营销吗, 无论我是在演讲还是在讲授,在讨论对于"病毒式营销"所带来的增长时,我都认为对于产品来说这是一个最好的吸引眼球和增加新用户的途径.它不但免费,而且可以带来广泛影响. 我对于病毒式营销的定义是:一个具有用户流量和特征的产品会自然而然地使目前的用户把产品传播给他们的圈子里(比如朋友.同事或者家人等). 我的定义中病毒式营销并不是下面这样: 物质性或非物质性的刺激传播 PR 口碑 病毒式营销的例子: Dropbox 文件夹分享:你和你的团队正在做一个项目,你需

浅谈Java中的final关键字与C#中的const, readonly关键字_java

在编程语言中都有某种方式,告知编译器一块数据是恒定不变的.有两个需求 1. 一个永不改变的编译器常量 2. 一个在运行时被初始化的值,而这个值不会被改变 在Java中,使用final修饰变量实现这两个需求 <pre name="code" class="java">//编译器常量 private final int valueOne = 9; private static final int VALUE_TWO = 99; public static f

javascript的语法作用域你真的懂了吗

原文:javascript的语法作用域你真的懂了吗      有段时间没有更新了,思绪一下子有点转不过来.正应了一句古话"一天不读书,无人看得出:一周不读书,开始会爆粗:一月不读书,智商输给猪.".再加上周五晚上看了下很久没看的湖南综艺节目<天天向上>关于出版书及读书的相关内容,看到相当多的嘉宾家里的书房让我惊叹也伴随着一种文人的向往.我虽然小的时候不太爱看书,但是随着自己一点点的长大,也不知道什么时候开始也有买书藏书看书的情节,而且正如郁钧剑老师所说的藏书有点会上瘾,即使

css中Margin用法你真的懂了么?

Margin是什么 CSS 边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时改变所有的外边距.--W3School 边界,元素周围生成额外的空白区."空白区"通常是指其他元素不能出现且父元素背景可见的区域.--CSS权威指南 我比较喜欢使用"外边距"这个词来解释margin(同理padding可以称之为"内边距",但是我又恰恰喜欢称呼padding为"补白"或

到底为什么做SEO?你真的懂吗?

SEO这个职业门槛很低,我记得我接触SEO这个职业完全是误打误撞,那是我大学即将毕业出来实习的时候,本意是想着从事做网站程序方面的,但是程序又没怎么搞明白,就想先找个工作做做看,刚好同班有几个同学要去一家网络公司面试,我就要了联系方式,征求面试的机会.简单的电话交谈后,很容易的约好次日与那几个同学一起去面试. 这是我人生中第一次面试,自然是得做足准备,我上网查询了下该公司的一些资料以及征聘的职位.当时他们只招两个职位:网站优化(SEO).网站推广(这个职位名称是很狭隘的:就是简单的外推),我选择

草根站长真的懂百度外链分析工具吗

自从2012年12月5日起,百度站长工具中的外链工具全面向全部网站用户开放后,很多网站的站长都认识到这个是一个获取外链的方式.通过查询站长们所关心领域的竞争对手的域名就可以简单的分析到他们网站的外链分布情况,同时我们也可以积累大量的有效外链资源. 那么我们是不是也可以跟着排名好的网站也把他们的资源当做自己的资源进行外链的发布呢?没错,这样是可以的,而且大部分的都是这么跟风的操作.但是最后我们的站长会逐渐暴露出一些问题:为什么我跟他发的外链都是一样,而且发布的数量甚至远远的超过他们,但是网站排名往

你真的懂站内优化吗

网站优化主要分为站内和站外两个部分,这两个部分缺一不可,但我们进行优化的时候首先要考虑的必须是站内优化,如果站内的一些基本优化没做好,就算你的外 链做得再好,所获得的排名可能并不是很理想,或者说如果你的站内基础优化没做好,你就必须花更多站外的优化来进行弥补,这样就是典型的苦逼SEO,正确的 方法是先把站内优化做到极致,然后再去做站外的推广和优化,最后两者珠联璧合,所向披靡.我们经常会犯一些常识性的错误,而正是这些不应该出现的错误,一 点点地吞噬了我们网站的权重.我们很多SEO是输在了细节上,那么

网站排名优化:你是否真的懂如何去做好内链工作

相信懂得SEO优化的站长都知道,内链在一个网站排名当中也是有着极具的影响力,据一些专业SEO优化站长研究,一般都在关键词排名当中占据25%-35%,这就充分证明了内链的重要性,至于其他的那65%的因素,相信不用笔者说大家也都知道,既然对于网站排名而言,内链如此的重要,那么我们是否真的去做好.把握内链了呢?这个很值得每位站长思考,今天笔者就与大家分享一些我做站时候总结做内链的一些经验心得吧. (一)站点主题与内链是否相关. 对于很多的站长而言,许多的都忽略内链工作,一味的以为只要把链接指向首页.栏

CSS魔法堂:你真的懂text-align吗?

前言 也许提及text-align你会想起水平居中,但除了这个你对它还有多少了解呢?本篇打算和大家一起来跟text-align来一次负距离的交往,你准备好了吗? text-align属性详解 The 'text-align' CSS property describes how inline content like text and inline-level element etc. is aligned in its parent block element.Does not control