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

  

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

上,而是让咱们更深刻的穿透编译器。这篇也是但愿对IL和Reflector不是很了解或者懒的了解的同窗可以重视起来,一样这篇我仍是dom

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

 

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

 

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

    件好像也能够定义在接口中,字段可不能够就不知道了,好吧,咱们看下IL,究竟是怎么样的。spa

1     public interface IFly
2     {
3         bool CanFly { get; set; }
4 
5         event Action ActionFly;
6     }

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

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

“构造函数”,本质上它也是方法,可是确不能定义在接口中,固然这个就不是IL的事情的,而是OO定义的问题了,由于接口定义的视频

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

一下,字段是否能够定义在接口中?

从截图中能够清楚的看到,“接口不能包含字段”的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

相关文章
相关标签/搜索