这段时间忙的像狗一样,写博客的事情也就耽搁了,继续扯,为什么说decimal神奇呢,大家都知道decimal是基元类型,但是

这个decimal类型在IL中居然没有相应的IL指令,也就是说CLR根本不认识decimal,全是编译器这一层在糊弄我们。

话不多说,看下最simple的例子,(加了点注释方便理解)

         static void Main(string[] args)
{
//居然调用了有参构造函数
decimal d = ; //直接将常量10推送到计算堆栈,然后将10放入局部变量索引为1的位置,也就是i
int i = ; //居然调用了隐式转换操作符,IL中就是调用相应的方法
d = i; //居然调用了显式转换操作符,IL中就是调用相应的方法
i = (int)d;
}

从IL中可以看到,对decimal的所有操作最后玩的都是方法,对编译器上层的我们而言却一无所知,那么下一个问题来了,这些

都是怎么做到的呢?

一:decimal源代码

当我们对decimal的实现充满好奇心的时候,最满足的方式的就是看源代码了,大家应该都有对新鲜事物的好奇心,不管看不看

得懂都得装X看。

1:implicit/explicit 操作符

从下面的IL中我们看到了这些乱七八槽的操作符,可能我们用的比较少或者有些人都没看过,不过终有它的用武之地。

结合上面的IL代码,我们发现了implicit和explicit关键字,这两个就是所谓的转换操作符,顾名思义,implicit就是所谓的隐式转换

操作符,explicit是显式转换了,再结合上面的IL代码,我们会发现给我们最终生成的是op_Implicit 和 op_Explicit方法。

可能有些人看不明白了,那我就举个例子吧。

     public class Program
{
static void Main(string[] args)
{
//这里就是语法糖,c=10 最终调用的就是:隐式转换调用
Complex c = ; //语法糖,(int)最终调用的是:显式转换调用
int j = (int)c;
}
} public struct Complex
{
public Complex(int num) { } /// <summary>
/// 隐式转换调用的方法
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static implicit operator Complex(int value)
{
return new Complex(value);
} /// <summary>
/// 强制转换调用的方法
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static explicit operator int(Complex value)
{
return Convert.ToInt32(value);
}
}

从我的sample和IL中看,我想你应该清楚了,为了方便我们编码效率以及更好的让人理解,C#提供了这么个好玩的语法糖,清晰明了。

2:op_*** 重载操作符

既然是基元类型就避免不了大量的算术运算和比较元算,那这些decimal又是如何做到的?还是继续在源代码里面找找。

从源代码里面可以看到,原来C#用operator重载运算符对我们这个++,--,!=,<= 进行了重载,和转换运算符一样,最终

在IL层也是转换为各种方法。

还是看个例子:

         static void Main(string[] args)
{
decimal i = ; decimal j = ; var r1 = i > j; var r2 = i == j;
}

好了,我想你一切都清楚了,当我们在愉快的写着++,--的时候,殊不知编译器给我们做的太多太多,最后得要感谢一下编译器。

神奇的decimal,也许面试会问到哦~的更多相关文章

  1. 面试官问,说一个你在工作非常有价值的bug

    如果你去参考面试,做足了准备,面对面试官员从容不迫,吐沫横飞的大谈自己的工作经历.突然,面试官横插一句:说一个你在工作非常有价值的bug.顿时,整个空气都仿佛都凝固了!“What?”... 我想没几个 ...

  2. linux驱动工程面试必问知识点

    linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...

  3. MQ消息中间件,面试能问些什么?

    MQ消息中间件,面试能问些什么? 为什么使用消息队列?消息队列的优点和缺点? kafka.activemq.rabbitmq.rocketmq都有什么优缺点? 面试官角度分析: (1)你知不知道你们系 ...

  4. [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  5. 每日一问:面试结束时面试官问"你有什么问题需要问我呢",该如何回答?

    面试结束时面试官问"你有什么问题需要问我呢",该如何回答?

  6. js原生方法传参的细节(面试必问)

    废话不说,直接上题. slice(),接收两个参数,第一个为开始index(从0开始),第二个为结束的index(也是从0开始,但是不包括index本身,只到index-1).返回值是截取的数组,原数 ...

  7. 最近找java实习面试被问到的东西总结(Java方向)

    时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻 ...

  8. 面试被问烂的 Spring IOC(求求你别再问了)

    广义的 IOC IoC(Inversion of Control) 控制反转,即"不用打电话过来,我们会打给你". 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 D ...

  9. 面试常问的几个排序和查找算法,PHP实现

    冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...

随机推荐

  1. 【Java每日一题】20161128

    package Nov2016; import java.util.ArrayList; import java.util.List; public class Ques1128 { public s ...

  2. mysql int(3)与int(11)的区别

    总结,int(M) zerofill,加上zerofill后M才表现出有点点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果i ...

  3. Linux命令速查手册,超详细Linux命令教程

    一.常用命令速查 ls cd pwd cat more less tail head cp scp mv mkdir rmdir touch rm ps kill top free clear tre ...

  4. PhantomJS快速入门

    本文简要介绍了PhantomJS的相关基础知识点,主要包括PhantomJS的介绍.下载与安装.HelloWorld程序.核心模块介绍等.由于鄙人才疏学浅,难免有疏漏之处,欢迎指正交流. 1.Phan ...

  5. Atitit.js javascript的rpc框架选型

    Atitit.js javascript的rpc框架选型 1. Dwr1 2. 使用AJAXRPC1 2.2. 数据类型映射表1 3. json-rpc轻量级远程调用协议介绍及使用2 3.1. 2.3 ...

  6. 【转】超实用PHP函数总结整理

    原文链接:http://www.codeceo.com/article/php-function.html 1.PHP加密解密 PHP加密和解密函数可以用来加密一些有用的字符串存放在数据库里,并且通过 ...

  7. 设计3D标签

    java自带的Label太枯燥了,真是拿不出手啊. 所以,我们要设计3D标签!! 看看下面这张图 原理 看看这图,可以看到哈哈有三种颜色:白色.黑色和灰色 实现的时候并不像PS那样,按几个按钮就O了 ...

  8. ENVI软件操作之【数据的显示操作】

    数据的显示操作主要包括以下的一些简单窗口操作 1.文件列表管理 1)可用的波段列表Available Bands List,使用于存取ENVI图像文件和显示图像文件的主要控制对话框.无论何时何地打开一 ...

  9. jQuery演示10种不同的切换图片列表动画效果

    经常用到的图片插件演示jQuery十种不同的切换图片列表动画效果 在线演示 下载地址 实例代码 <!DOCTYPE html> <html lang="en" c ...

  10. 15款精美的 WordPress 电子商务网站模板

    在这篇文章中,我们收集了15款精美的 WordPress 电子商务网站模板.WordPress 作为最流行的博客系统,插件众多,易于扩充功能.安装和使用都非常方便,而且有许多第三方开发的免费模板,安装 ...