学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


相关文章
|
7月前
|
网络协议 C# C++
BytesIO | C# 超简洁的TCP服务端开发(完整源码+视频教程)
本章将继续利用BytesIO开发TCP的服务端,简洁明了依然是主旋律,我们要在三十行代码内除了实现一个TCP服务端以外,使其支持聊天室(消息转发)、连接数限制、心跳超时检测等功能。 现在,一起跟着视频敲一敲吧!
519 0
BytesIO | C# 超简洁的TCP服务端开发(完整源码+视频教程)
|
7月前
|
网络协议 C# C++
BytesIO | 零基础轻松看懂 C# TCP客户端(完整源码+视频教程)
零基础轻松看懂 C# TCP客户端(完整源码+视频教程) 如果非IT行业的女朋友都能学会的话,应该就算0基础入门的教学视频了吧! 超简单的C# TCP开发入门,短短的代码,完整的功能,掏出你的VS码一个试试手吧!
185 0
BytesIO | 零基础轻松看懂 C# TCP客户端(完整源码+视频教程)
|
C# C++ Windows
C#编程-92:ILDasm启动方法
C#编程-92:ILDasm启动方法
C#编程-92:ILDasm启动方法
|
C# C++ 搜索推荐
写给请求推荐C#视频教程的研二学生
【来信】   我是一名研二学生,我现在学习C#,老师能不能推荐一些视频教程。我看你的CSDN上没有C#相关的资料啊。多谢老师。因为我之前一些在学习C++,所以才认识老师的,当时我还在CSDN上付费买了相关视频。但是因为我换了导师,现在不得不换成学习C#了。期待老师的指导。
868 0
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
33 3
|
23天前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
38 4
|
3月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
46 2