学C#你应该熟练使用ILDasm和Reflector【带视频教程】
来源:互联网 发布:循环算法的时间复杂度 编辑:程序博客网 时间:2024/05/18 18:02
我们在学习C#的时候通常都会多多少少接触ILDasm和Reflector,这两样工具让我们对C#的理解不会只停留在编译器这个层面
上,而是让我们更深入的穿透编译器。这篇也是希望对IL和Reflector不是很了解或者懒的了解的同学能够重视起来,同样这篇我还是
以QA的形式来告知这两样工具的强大和必要性。
Q:接口中只能存在方法吗?
A: 这个问题,如果你对IL不熟悉的话,你可能会认为是错的,你可能会天真的认为,记得不错的话,属性好像也可以定义在接口中,事
件好像也可以定义在接口中,字段可不可以就不知道了,好吧,我们看下IL,到底是怎么样的。
1 public interface IFly2 {3 bool CanFly { get; set; }4 5 event Action ActionFly;6 }
然后我们再看看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 = 0; i < 1000; 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的值来尽可能的避免重复。
1 static void Main(string[] args) 2 { 3 var rand = new Random(); 4 5 for (int i = 0; i < 1000; i++) 6 { 7 Console.WriteLine(rand.Next()); 8 } 9 Console.Read();10 }
请猛击视频教程:http://t.cn/RPtyOFp
- 学C#你应该熟练使用ILDasm和Reflector【带视频教程】
- ildasm Reflector
- .vs2008辅助软件ildasm和reflector
- .vs2008辅助软件ildasm和reflector
- ILDasm和ILAsm简单使用
- 由浅入深学C# 视频教程
- 你能熟练使用Dictionary字典和List列表吗?
- Ildasm 使用
- 熟练使用 LLDB,让你调试事半功倍
- 三篇文章让你熟练使用GreenDAO
- C# 中 10 个你真的应该学习(和使用!)的功能
- C#中10个你真的应该学习(和使用!)的功能
- 为什么你应该学Python?
- 你应该学些什么
- 带你学C带你飞
- 【3分钟带你学】null和undefined
- 视频教程手把手教你学Photoshop
- ILdasm 的使用
- 可空类型为什么可以为空?也许会被面试到哦。。。
- 目标检测算法:RCNN、YOLO vs DPM
- node.js学习(十五、Events事件模块)
- const,readonly 这些你真的懂吗? 也许会被面试到哦。。。
- ios微信h5音频audio无法自动播放问
- 学C#你应该熟练使用ILDasm和Reflector【带视频教程】
- python安装及numpy的安装
- 关于“属性”的几个问题,也许面试会问到哦~
- python基础篇日记
- nyoj 35 表达式求值
- DL-1: Tips for Training Deep Neural Network
- 关于“参数”的几个问题,也许面试会问到哦~
- ios UIAlertController使用
- 关于“构造函数”中的几个小问题,也许面试会问到哦~