我们在学习C#的时候通常都会多多少少接触ILDasm和Reflector,这两样工具让我们对C#的理解不会只停留在编译器这个层面

上,而是让我们更深入的穿透编译器。这篇也是希望对IL和Reflector不是很了解或者懒的了解的同学能够重视起来,同样这篇我还是

以QA的形式来告知这两样工具的强大和必要性。

Q:接口中只能存在方法吗?

A: 这个问题,如果你对IL不熟悉的话,你可能会认为是错的,你可能会天真的认为,记得不错的话,属性好像也可以定义在接口中,事

件好像也可以定义在接口中,字段可不可以就不知道了,好吧,我们看下IL,到底是怎么样的。

     public interface IFly
{
bool CanFly { get; set; } event Action ActionFly;
}

然后我们再看看IL,会发现 “属性” 其实GetXXX/SetXXX方法,“事件”其实就是 Add_XXX/Remove_XXX方法,

当然还有一个 “索引器”,本质上也是 get_Item/set_Item 这个配对方法,看完这三个属性之后,可能有些人会想来出来还有一个

“构造函数”,本质上它也是方法,但是确不能定义在接口中,当然这个就不是IL的事情的,而是OO定义的问题了,因为接口定义的

目的是规范,而ctor是初始化类,属于类的一种实现,而接口的规范就是只能提供方法的定义,不能提供方法的实现,现在我们再看

一下,字段是否可以定义在接口中?

从截图中可以清楚的看到,“接口不能包含字段”的error信息,好了,到现在我们可以总结一句话就是,接口中只能定义除构造函数

之外的方法,这个例子展示IL对我们分析问题的重要性。

Q:Random.Next为什么多次New之后,会出现重复?

        static void Main(string[] args)
{
for (int i = ; i < ; i++)
{
var rand = new Random(); Console.WriteLine(rand.Next());
}
Console.Read();
}

A: 这个问题问的好,要想知道为什么,我们得一定要用Reflector来反编译下Random类的代码,到底里面是怎么实现的,要知

其然,还要知其所以然,下面我们来看看反编译后的代码。

从next函数中的定义可以看出,其实return 的num值取决于seedArray,那么我们下一步看看seedArray到底是怎么玩起来的。

通过代码,我们可以找到其实就是在ctor里面做的。

我们可以看到这个for循环,大概看下代码意思,可以看出第一个for是给seedArray灌值,第二个for是取下标就是求余,然后-=操作

来让SeedArray中的值更加的混乱,反正大体意思就是SeedArray中的值比较乱,比较随机,然后我们的next就是通过inext和inextp

取SeedArray值,从而造成随机数,这个不难看出,随机的源头就是我们给过去的Seed值,然后我们看到inext和inextp都是++操作,

所以我们多次next操作之后,这就保证我们取数永远都是随机的,而如果源头的Seed一样的话,就会导致return的值一直重复。

这次我们把Random放到for循环之外再看看,因为inext和inextp是通过++操作来获取SeedArray的值来尽可能的避免重复。

         static void Main(string[] args)
{
var rand = new Random(); for (int i = ; i < ; i++)
{
Console.WriteLine(rand.Next());
}
Console.Read();
}

请猛击视频教程:http://t.cn/RPtyOFp

学C#你应该熟练使用ILDasm和Reflector【带视频教程】的更多相关文章

  1. 路飞学城知识点3缓存知识点之一Djang自带的缓存

    缓存是暂时把数据放到哪儿的意思,用于提高查询的访问速度用的,mysql等关系型数据库通常用作备份,数据库进行增删改操作一段时间内存同步到缓存(非关系型数据库中) 缓存与内存的区别: 通常把数据放到内存 ...

  2. IL反编译的实用工具Ildasm.exe

    初识Ildasm.exe——IL反编译的实用工具    https://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html   学 ...

  3. 黄聪:《跟黄聪学WordPress插件开发》

    续<跟黄聪学WordPress主题开发>之后,又一个作品完成!<跟黄聪学Wordpress插件开发>,国内最好的Wordpress插件开发视频教程!! 目录预览: WordPr ...

  4. 带你从零学ReactNative开发跨平台App开发(二)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  5. 带你从零学ReactNative开发跨平台App开发(一)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  6. 带你从零学ReactNative开发跨平台App开发-[react native 仿boss直聘](十三)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  7. 带你从零学ReactNative开发跨平台App开发(十一)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  8. 带你从零学ReactNative开发跨平台App开发(十)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  9. 带你从零学ReactNative开发跨平台App开发(九)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

随机推荐

  1. Firemonkey 使用 TImage 显示动画图片

    参考官网:http://docwiki.embarcadero.com/Libraries/Seattle/en/FMX.Ani.TBitmapListAnimation 延伸阅读:[工具] GIF ...

  2. 展示 Popup 的使用方法

    源码下载:[原创]展示Popup的使用方法.zip

  3. 关于JAVA日志

    虽然工作有一年了,做了好几个项目,但是对于日志这一块还只局限于拷贝配置文件,对于实现细节和灵活使用都还不会,主要的原因还是以前一直没有重视,在经历了好几个项目以后越发的觉得日志的重要性了.所以这几天都 ...

  4. C++/C互相调用

    C调用C++: 在C++程序中使用extern "C"{}来明确要求C++编译器不要对被调用的C++函数进行换名处理, 当然,这会导致函数无法重载 C++调用C: 在C++程序中使 ...

  5. 【LeetCode】389 Find the Difference(java)

    原题 Given two strings s and t which consist of only lowercase letters. String t is generated by rando ...

  6. JSON字符串和java对象的互转【json-lib】

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...

  7. js undefine,null 和NaN

    undefined 类型只有一个值,即 undefined. null 类型也只有一个值,即 null. null 指空值(empty value)或指曾赋过值,但是目前没有值 undefined 指 ...

  8. JAVA多线程之间共享数据BlockingQueue介绍

    在JAVA的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. ...

  9. 免费的 Photoshop Apple Watch 原型设计素材

    大量的扁平化的苹果设备原型展示了响应式的 Web 设计.这是一组免费的 Photoshop Apple Watch 原型 PSD 设计素材,文件包括 iPhone.iPad. iMac 和 Macbo ...

  10. 我们的动机(Our motivation)

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