[c#基础]关于const和readonly常见的笔试题剖析
引言
有那么几天没更新博客了,发现到了不得不写的地步,总是有那么个声音在强迫自己,虽然工作很累,但是有些东西不写出来,不能原谅自己。今天为什么总结这两个关键字的区别,总觉得这两个关键字的用法用的太习惯了,没想过为什么这么用,就好比为什么一直用右手拿筷子,这么习惯。为什么我要用右手拿筷子,为什么不用左手呢?突然你就这么干了,发现你和周边很不协调,而且还夹不了菜。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=?,知道的先忍着,看一下到底是多少:
为什么会这样呢?ILspy看一下,到底是咋回事?
通过这也看不到什么不同啊,不要急,慢慢来,对比一下就知道不同了。
说明一下静态只构字段:
改为下面的就可以了:
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试一试。
题二:
这个题,主要是考察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=?,知道的,也别急,先忍着,看一下到底是多少:
那么这个面试题的IL是什么样子的呢?这里为了方便对比,将readonly的IL部分贴到一起,方便对比。
const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值,readonly修饰的常量则延迟到运行的时候。
通过IL的对比,对他们的区别有了更深的认识了吧。希望对你有所帮助。
题四:
这个考察的主要是const修饰的常量必须初始化。
总结
东西很基础,只是想研究个究竟的时候,通过IL看了一下,虽然基础,如果通过IL一探究竟的话,还是收获颇深的,如果对你有所帮助不妨推荐一下。谢谢!
参考文章:http://blog.csdn.net/shellching/article/details/8516789
[c#基础]关于const和readonly常见的笔试题剖析的更多相关文章
- [c#基础]关于try...catch最常见的笔试题
引言 在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下. try..catch语法 try-catch语句由一个try块后跟一个或多个 ...
- SQLServer 常见SQL笔试题之语句操作题详解
SqlServer 常见SQL笔试题之语句操作题详解 by:授客 QQ:1033553122 测试数据库 CREATE DATABASE handWriting ON PRIMARY ( name = ...
- 基础知识---const、readonly、static
const:静态常量,也称编译时常量(compile-time constants),属于类型级,通过类名直接访问,被所有对象共享! a.叫编译时常量的原因是它编译时会将其替换为所对应的值: b.静态 ...
- 【笔试必备】常见sql笔试题(30题)
sql是测试从业者必备的技能之一,基本上也是笔试必考内容. 所以,不要让sql拖了后腿,有些测友一遇到多表关联查询就犯晕,甚至连单表的执行顺序都没搞懂,下面简单介绍下,顺便给一些题供大家练习. 单表执 ...
- 常见sizeof 笔试题
最近面试过程中遇到了很多很多sizeof的问题. 现在总结一下: #include <stdio.h> #include <string.h> void fun(int arr ...
- C#面试-关于const和readonly(看了一个点赞很多的帖子有感而发!)
前景提要: 最近大家都在面试,讨论最多.最基础的问题,莫过于“关于const和readonly常见的笔试题剖析”,等等的大牛解析.我就是一个小菜,只不过,有点不敢苟同大牛的意见.废话少说,进入重点. ...
- C#基础知识七之const和readonly关键字
前言 不知道大家对const和readonly关键字两者的区别了解多少,如果你也不是很清楚的话,那就一起来探讨吧!探讨之前我们先来了解静态常量和动态常量. 静态常量 所谓静态常量就是在编译期间会对变量 ...
- C#夯实基础系列之const与readonly
一.const与readonly的争议 你一定写过const,也一定用过readonly,但说起两者的区别,并说出何时用const,何时用readonly,你是否能清晰有条理地说出个一二三 ...
- C#基础知识系列八(const和readonly关键字)
前言 不知道大家对const和readonly这两个关键字的区别有什么了解,原来自己之前还真不清楚它们到底是怎么回事,那么如果你也不是很清楚的话,可以一起来探讨一下.在了解这两个关键字的时候我们先来了 ...
随机推荐
- CSS3:text-overflow实现文字截取,超出部分显示省略号
1. 概述 使用text-overflow:ellipsis对溢出文本显示省略号有两个好处, 一是不用通过后端程序截取: 二是有利于SEO. 2. text-overflow的属性 clip: 当对象 ...
- SSDB图形界面管理工具:phpssdbadmin安装部署
环境: 14.04.1-Ubuntu 1.安装Nginx apt-get install nginx ubantu安装完Nginx后,文件结构大致为: 所有的配置文件都在 /etc/nginx下: 启 ...
- DevExpress Carousel 设置水平滑动列表
DevExpress中Carousel控件的应用 Carousel,直译为旋转木马,即旋转视图,可以做为数据的展示或者菜单项. 要实现触摸左右滑动的效果,其实是比较容易的,直接在CarouselPan ...
- android 获取IMSI信息(判断是移动,联通,电信手机卡)
首先我们需要知道手机IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信.那么第一步就是先获取手机IMSI号码:代码如下 /** *获取IMSI信息 * ...
- everything + autohotkey的配合使用
一,everything是文件搜索神奇,瞬间定位到文件,在众多的文件中找到你需要的文件.(百度下载就好,分32位和64位) 二,autohotkey是热键启动设置,方便的打开常用的应用. 直接使用 ...
- linux的学习记录随笔
为什么学习linux 因为操作系统是一种介质,你要接触其中的东西,首先必须要有介质,而linux在服务器端是老大哥的地位,所以呢,学习linux吧. 学习的方式 可以看视频 imooc.百度传课.网易 ...
- Python元组
Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 = ('physi ...
- [LeetCode] Sqrt(x) 求平方根
Implement int sqrt(int x). Compute and return the square root of x. 这道题要求我们求平方根,我们能想到的方法就是算一个候选值的平方, ...
- python基础-面向对象进阶
一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
- HttpHelper
/// <summary> /// 类说明:HttpHelper类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提 ...