神奇的decimal,也许面试会问到哦~
这段时间忙的像狗一样,写博客的事情也就耽搁了,继续扯,为什么说decimal神奇呢,大家都知道decimal是基元类型,但是 这个decimal类型在IL中居然没有相应的IL指令,也就是说CLR根本不认识decimal,全是编译器这一层在糊弄我们。 ? ? ?话不多说,看下最simple的例子,(加了点注释方便理解) Main(
d =
i =
d =
i = ( }
从IL中可以看到,对decimal的所有操作最后玩的都是方法,对编译器上层的我们而言却一无所知,那么下一个问题来了,这些 都是怎么做到的呢? 一:decimal源代码 当我们对decimal的实现充满好奇心的时候,最满足的方式的就是看源代码了,大家应该都有对新鲜事物的好奇心,不管看不看 得懂都得装X看。 1:implicit/explicit 操作符 ? ? 从下面的IL中我们看到了这些乱七八槽的操作符,可能我们用的比较少或者有些人都没看过,不过终有它的用武之地。 结合上面的IL代码,我们发现了implicit和explicit关键字,这两个就是所谓的转换操作符,顾名思义,implicit就是所谓的隐式转换 操作符,explicit是显式转换了,再结合上面的IL代码,我们会发现给我们最终生成的是op_Implicit 和?op_Explicit方法。 可能有些人看不明白了,那我就举个例子吧。 Main(
Complex c =
j = (
Complex(
Complex(
}
从我的sample和IL中看,我想你应该清楚了,为了方便我们编码效率以及更好的让人理解,C#提供了这么个好玩的语法糖,清晰明了。 2:op_*** 重载操作符 ? ? 既然是基元类型就避免不了大量的算术运算和比较元算,那这些decimal又是如何做到的?还是继续在源代码里面找找。 ? ?从源代码里面可以看到,原来C#用operator重载运算符对我们这个++,--,!=,<= 进行了重载,和转换运算符一样,最终 在IL层也是转换为各种方法。 ? ?还是看个例子: Main( i =
j =
r1 = i >
r2 = i == }
好了,我想你一切都清楚了,当我们在愉快的写着++,--的时候,殊不知编译器给我们做的太多太多,最后得要感谢一下编译器。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ORA-01033: ORACLE initialization or shutdown in progres
- 【第17篇】通过fastjson去操作对象数据并处理json数据
- ios – Xcode 8.0的Wildcard App ID问题
- Oracle函数--instr()
- 设计模式无限重读之单一职责原则(SRP)
- DEDE利用Ajax实现调用当前登录会员的信息简要说明
- eMMC 原理 :Flash Memory 简介
- react+redux教程(一)connect、applyMiddleware、thunk、w
- 细数reactNative的坑
- [C#] 排除无须纳入交易的查询,避免产生不必要的分散式交易