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

时间:2022-08-22 20:43:05

引言

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

常量

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

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

readonly和const

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

如何区别呢?

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

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

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

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

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

题一:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.ConstReadonly
{
class Program
{
static readonly int A = * B;
static readonly int B = ;
static void Main(string[] args)
{
Console.WriteLine("A={0},B={1}", A, B);
Console.Read();
}
}
}

那么A=?,B=?,知道的先忍着,看一下到底是多少:
[c#基础]关于const和readonly常见的笔试题剖析

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

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

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

说明一下静态只构字段:

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

改为下面的就可以了:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.ConstReadonly
{
class Person
{
public static readonly int C;
static Person()
{
C = ;
}
}
}

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

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

题二:

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

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

题三:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.ConstReadonly
{
class Program
{
const int A = * B;
const int B = ;
static void Main(string[] args)
{
Console.WriteLine("A={0},B={1}", A, B);
Console.Read();
}
}
}

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

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

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

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

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

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

题四:

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

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

总结

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

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

[c#基础]关于const和readonly常见的笔试题剖析的更多相关文章

  1. [c#基础]关于try...catch最常见的笔试题

    引言 在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下. try..catch语法 try-catch语句由一个try块后跟一个或多个 ...

  2. SQLServer 常见SQL笔试题之语句操作题详解

    SqlServer 常见SQL笔试题之语句操作题详解 by:授客 QQ:1033553122 测试数据库 CREATE DATABASE handWriting ON PRIMARY ( name = ...

  3. 基础知识---const、readonly、static

    const:静态常量,也称编译时常量(compile-time constants),属于类型级,通过类名直接访问,被所有对象共享! a.叫编译时常量的原因是它编译时会将其替换为所对应的值: b.静态 ...

  4. 常见sizeof 笔试题

    最近面试过程中遇到了很多很多sizeof的问题. 现在总结一下: #include <stdio.h> #include <string.h> void fun(int arr ...

  5. C&num;面试-关于const和readonly(看了一个点赞很多的帖子有感而发!)

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

  6. C&num;基础知识七之const和readonly关键字

    前言 不知道大家对const和readonly关键字两者的区别了解多少,如果你也不是很清楚的话,那就一起来探讨吧!探讨之前我们先来了解静态常量和动态常量. 静态常量 所谓静态常量就是在编译期间会对变量 ...

  7. C&num;夯实基础系列之const与readonly

    一.const与readonly的争议       你一定写过const,也一定用过readonly,但说起两者的区别,并说出何时用const,何时用readonly,你是否能清晰有条理地说出个一二三 ...

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

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

  9. c&num;基础--常量&lpar;const&rpar;&comma;只读字段&lpar;readonly&rpar;

    1.0:常量 常量被关键字const 所修饰 我们来看看常量的demo class Program { static void Main(string[] args) { const string n ...

随机推荐

  1. Struts、JSTL标签库的基本使用方法

    一 使用Struts标签之前需要经过下面3个步骤的配置. 1.导入TLD文件. 2.在web.xml中注册标签库. 3.在页面中引入标签库. 下面详细介绍以上步骤. 1 导入TLD文件. TLD文件是 ...

  2. 破解官方recovery的签名验证

    步骤简述1.解包recovery.img,2.反编译/sbin/recovery,用ida64plus3.在反编译出来的文本中查找:signature 4.简单的看一下指令流程,CBZ下面是faile ...

  3. C&plus;&plus;中的类指针

    代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...

  4. 享受一下大神的感觉&comma; unity中用C&num;自己封装dll

    第一次写博客,有什么不对的地方,欢迎大家指出 (1)打开vs(本人用的是vs2013)然后建一个项目,如下图所示,选择.ENT3.5的框架,或者低于3.5的,这是因为Unity里面用的框架可能在3.5 ...

  5. Spring Data JPA 实例查询

    一.相关接口方法     在继承JpaRepository接口后,自动拥有了按"实例"进行查询的诸多方法.这些方法主要在两个接口中定义,一是QueryByExampleExecut ...

  6. python基础——抽象类

    python基础--抽象类 1  什么是抽象类 与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化 2 为什么要有抽象 ...

  7. 全球第一免费开源ERP Odoo Ubuntu最佳开发环境独家首发分享

    起源 近年来随着国内的互联网经济的快速腾飞,诞生了很多开源软件创造的市场价值以及企业价值神话,特别是对于企业ERP领域,一直以来都是高昂的国内外产品充实,国内的中小成长型企业越来越需要一套好看又能打, ...

  8. js数组方法详解(最新最全)

    数组是js中最常用到的数据集合,其内置的方法有很多,熟练掌握这些方法,可以有效的提高我们的工作效率,同时对我们的代码质量也是有很大影响.本文所有的栗子都是在es7环境下测试的,如果有问题欢迎留言交流 ...

  9. SpringBoot系列&colon; Redis基础

    ============================Redis 安装============================redis 采用单线程多路复用的机制提供并发访问, 用到了 Linux ...

  10. Linux SD&sol;MMC&sol;SDIO驱动分析&lowbar;转

    转自:Linux SD/MMC/SDIO驱动分析    https://www.cnblogs.com/cslunatic/p/3678045.html#3053341 一.SD/MMC/SDIO概念 ...