当前位置: 首页 > news >正文

学C#你应该熟练使用ILDasm和Reflector【带视频教程】

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

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

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

 

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

 

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

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

1     public interface IFly
2     {
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的值来尽可能的避免重复。

static void Main(string[] args)
        {
            var rand = new Random();

            for (int i = 0; i < 1000; i++)
            {
                Console.WriteLine(rand.Next());
            }
            Console.Read();
        }

 

 

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


相关文章:

  • 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度
  • 关于java写进mysql中文乱码问题
  • 从客户端(?)中检测到有潜在危险的 Request.Path 值 的解决方案
  • 最少换乘
  • rpm命令使用总结
  • 学习ios【1】Objective-C 基本语法
  • Mac使用大全
  • JSONArray转ListT
  • 遥感影像显示相关的技术总结
  • 2016.04.8-2016.04.14这周工作时间和内容
  • Kafka常用操作
  • Scalaz(34)- Free :算法-Interpretation
  • 思科4500系列与华为9300系列交换机介绍与选配
  • Java超时控制的实现
  • HeadFirst设计模式(三) - 装饰者模式
  • 【EOS】Cleos基础
  • 【个人向】《HTTP图解》阅后小结
  • Angularjs之国际化
  • canvas 绘制双线技巧
  • CentOS从零开始部署Nodejs项目
  • CSS 专业技巧
  • ES学习笔记(12)--Symbol
  • HomeBrew常规使用教程
  • Javascript弹出层-初探
  • Linux Process Manage
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • vue的全局变量和全局拦截请求器
  • webpack4 一点通
  • Webpack入门之遇到的那些坑,系列示例Demo
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 构造函数(constructor)与原型链(prototype)关系
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #Linux(帮助手册)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • .htaccess配置重写url引擎
  • .jks文件(JAVA KeyStore)
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .Net Winform开发笔记(一)
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .Net接口调试与案例
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .net网站发布-允许更新此预编译站点
  • @Service注解让spring找到你的Service bean
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ IOS ] iOS-控制器View的创建和生命周期
  • []串口通信 零星笔记
  • [20190401]关于semtimedop函数调用.txt