《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)...

概念

  • 编译时


编译时顾名思义就是正在编译的时候。那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码。(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言。比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL。另外还有链接器、汇编器。为了了便于理解我们可以统称为编译器)

那编译时就是简单的作一些翻译工作,比如检查你有没有粗心写错啥关键字了啊。有啥词法分析,语法分析之类的过程。就像个老师检查学生的作文中有没有错别字和病句一样。如果发现啥错误编译器就告诉你。如果你用微软的VS的话,点下build。那就开始编译,如果下面有errors或者warning信息,那都是编译器检查出来的。所谓这时的错误就叫编译时错误,这个过程中做的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态就是没把代码放内存中运行起来,而只是把代码当作文本来扫描下)。

  • 运行时

所谓运行时就是代码跑起来了。被装载到内存中去了。(你的代码保存在磁盘上没装入内存之前是个死家伙。只有跑到内存中才变成活的)。而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样。不是简单的扫描代码。而是在内存中做些操作,做些判断。

代码  

为了更加直观的理解编译时和运行时的区别,我们看以下代码:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             mm a = new mm();
 6 
 7             nn b = new nn();//实例化一个nn的对象b
 8 
 9             mm c = b; //把mm的对象c指向b
10 
11             Console.WriteLine("非虚方法");
12 
13             a.F();
14             b.F();
15             c.F();
16 
17             Console.WriteLine("虚方法");
18             a.G();
19             b.G();
20             c.G();
21             Console.ReadKey();
22         }
23     }
24     class mm
25     {
26         public void F()
27         {
28             Console.WriteLine("mm.F()");
29         }
30 
31         public virtual void G()        //声明了一个虚方法
32         {
33             Console.WriteLine("mm.G()");
34         }
35     }
36     class nn : mm
37     {
38         new public void F()         //隐藏了父类的F方法
39         {
40             Console.WriteLine("nn.F()");
41         }
42 
43         public override void G()        //重写了方法G
44         {
45             Console.WriteLine("nn.G()");
46         }
47     }

运行结果截图如下:

对象a,b没有问题,但对象c的编译时类型为mm,那是因为对象a,b,c都是引用类型,运行时类型=编译时类型,但对于虚方法来说,调用哪个方法取决于该实例运行时的类型。

总结

 2.用运行时常量(readonly)而不是编译时常量(const)
    运行时常量(readonly)
        不能声明在方法中
        使用更灵活,便于后期维护
        运行时求值
        能使用任意类型
        二进制层次兼容
    编译时常量(const)
        可声明在方法中
        性能优于readonly
        值在目标代码中替换
        仅能用于基本类型(内建的整数和浮点类型)、枚举或字符串
        二进制层次不兼容
        在编译时必须得到确定数值(或永远都不会改变)时使用,例如attribute的参数和枚举的定义等

转载于:https://www.cnblogs.com/hekuerle/p/6773298.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MQ介绍

一:MQ介绍 1:异步 2:解耦 3:削峰 二:MQ优缺点 三:Kafka和RabbitMQ和RocketMQ比较

转:A/B测试:实现方法

概念:http://www.aliued.cn/2010/09/13/ab-testing-basic-concept.html 我们先来看一个图: (注:感谢Algo提供本图。) 上图展示了 A/B 测试的实现原理。从左到右,四条较粗的竖线代表了 A/B 测试中的四个关键…

mac修改host

1.打开终端 2.输入sudo vi /etc/hosts 3.输入密码 4.进入文件hosts,然后按“i”,进入编辑模式 5.把你的host添加到最后 6.esc推出编辑模式 7.输入:wq,保存退出

语法之知识点的改进(Func/Action)

上一章我们讲到关于面向对象思想上C#和JAVA之差别。笔者分别从面向对象的三大特性入手。而本章主要讲一些C#改进的知识点。在.NET Framework 2.0之后出现很多新的知识点。这些知识点更是让C#在写法上更加的多样性。有些写法还真的让笔者觉得很有不错。由于这一部分的知识更多是…

linux取字符串的前面,Linux Shell 截取字符串

shell中截取字符串的方法很多${var#*/}${var##*/}${var%/*}${var%%/*}${var:start:len}${var:start}${var:0-start:len}${var:0-start}下面用几个例子展示一下:1) 获得字符串的长度语法:${#var}示例代码:str"http://www.fengbohello.xin…

idea修改新的git提交地址

更换git地址步骤 1、点击VCS 2、点击Git 3、点击Remotes 点击框中链接即可在右边看到一个铅笔字样的按钮,即可看到如图所示弹窗 点击铅笔(编辑),看到新的弹窗,链接已经被默认选中这时候粘贴新的git地址,点…

mac idea实现全局替换

点击Edit ----- Find ----- Replace in Path 例如要把项目中的cc替换为aa 点击Replace All

现代希腊语字母表

转载于:https://www.cnblogs.com/zhangzujin/p/6782532.html

SHA-1算法c语言实现

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息。SHA1会产生一个160…

Mac安装RocketMQ和可视化控制台教程

1:下载: http://rocketmq.apache.org/docs/quick-start/, 直接下载源代码版本 2:使用maven进行源码编译: mvn -Prelease-all -DskipTests clean install -U 3:环境配置 找到已经安装好的 jdk 位置,通过命令:/usr/libexec/java_home 在.zshrc中加入JAVA…

基于redis 内存数据库简单使用

在ecplise中使用内存数据的客端户,前提要准备要下载两个jar包 commons-pool2-2.0.jar jedis-2.4.2.jar 前提准备做好了,那我们就开启redis的服务,打开一个命令窗体输入例如以下命令:redis-server 或redis-server redis根目\redis.conf se…

李连杰年度巨作霍元甲主题曲:周杰伦唱

年末最受人期待的影片《霍元甲》即将全球公映了,视李连杰为偶像的周杰伦将全权负责影片主题曲的创作。而在1月10日,这首电影同名新作已经通过全亚洲50家电台同众多歌迷和影迷见面了。 按周董的话说,这首歌就是在《双截棍》和《龙拳》的基础上…

[Noi2014]随机数生成器

来自FallDream 的博客&#xff0c;未经允许&#xff0c;请勿转载&#xff0c; 谢谢。 n,m<5000 前面生成的一堆数列 意义不明 实际上就是给你一个矩阵求排序后字典序最小的路径序列 发现(1,1)->(n,m)在选了(x,y)之后就变成了选(1,1)->(x,y)和(x,y)->(n,m) 所以直接…

Inherts

在http://mqingqing123.cnblogs.com/archive/2006/01/14/317162.html里&#xff0c;我介绍了CodeFile来取代Codebehind&#xff0c;可能你会感觉疑惑&#xff1a;ASP.NET工作组花费了很大的时间建立了与.NET1.1不同的后台文件模型&#xff0c;为什么没有更改.NET1.1的Inherits呢…