这段时间忙的像狗一样,写博客的事情也就耽搁了,继续扯,为什么说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. ASP.NET MVC 网站开发总结(三) ——图片截图上传

    本着简洁直接,我们就直奔主题吧,这里需要使用到一个网页在线截图插件imgareaselect(请自行下载). 前台页面: <!DOCTYPE html> <html> < ...

  2. win10系统iis下部署搭建https (ssl/tls)本地测试环境

    有时想要把公司的某些XX项目部署成https站点,是为了在传输层加密传输,防止他人嗅探站点重要数据信息,平常我们使用的http方式都是明文方式传输的很不安全,容易被他人窃取.而有些时候要在本地搭建ht ...

  3. 【FOL】第三周

    这周还是在改自己的这个框架,被多线程折腾了两天,最终无奈放弃在游戏启动时调用引擎进行图片相关资源的初始化,当然进展还是不错的. 嗯,下面还是以流水的方式继续记录一下本周完成的工作: 1.调通了客户端与 ...

  4. textview滑动效果

    网上很多在xml中改的我经过试验没用,可能是版本不兼容的原因,但在java代码中改有用head_tv1.setEllipsize(TextUtils.TruncateAt.MARQUEE);head_ ...

  5. DDD开发框架ABP之本地化/多语言支持

    本地化(Localization)也就是多语言功能,借此用户能够选择他的母语或熟悉的语言来使用系统,这显然非常有利于软件系统推向国际化.一个应用程序的UI界面至少有一种语言,DDD开发框架ABP就提供 ...

  6. 【FFmpeg】Windows下FFmpeg编译

    由于FFmpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译,需要在Windows下配置一个类 ...

  7. 一款很实用的jQuery鼠标悬浮有动画效果的响应式瀑布流插件

    一款很实用的jQuery鼠标悬浮有动画效果的响应式瀑布流插件 在线预览 下载地址 实例代码 <!doctype html> <html lang="zh"> ...

  8. Headroom.js – 快速响应用户的页面滚动操作

    Headroom.js 是一个轻量级,高性能的JS插件(无依赖性!),允许你响应用户的滚动行为.Headroom.js 使您能够在适当的时候把元素融入视图,而其它时候让内容成为焦点.Headroom. ...

  9. 我们的动机(Our motivation)

    我们的动机(Our motivation) There are many PHP frameworks nowadays, but none of them is like Phalcon (Real ...

  10. Listbox与Listbox with key的区别

    标准解释: ListboxVisualization as listbox in which a list of entries is displayed with one short descrip ...