VS反编译查看源码时,会把类实现的所有接口都直接显示

  今天在看ArrayList,发现一个很有意思的问题。从VS里反编译看,ArrayList继承了ICollection、 IEnumerable、IList和ICloneable,而IList又继承了ICollection和IEnumerable, ICollection又继承了IEnumerable。见下图:

  

  

  

  接口是成员的签名,继承接口的父接口并没有意义,微软应该不会写这种代码。所以怀疑这只是反编译显示DLL的优化,方便查看而已,实际上ArrayList只直接继承了IList和ICloneable。

  写个DEMO测试下:

 1     interface IA
 2     {
 3         int AAA();
 4     }
 5     interface IB : IA
 6     {
 7         int BBB();
 8     }
 9     interface IC : IB
10     {
11         int CCC();
12     }
13     interface ID : IC
14     {
15         int DDD();
16     }
17     class EnumeratorClass : ID
18     {
19         public int AAA()
20         {
21             throw new NotImplementedException();
22         }
23 
24         public int BBB()
25         {
26             throw new NotImplementedException();
27         }
28 
29         public int CCC()
30         {
31             throw new NotImplementedException();
32         }
33 
34         public int DDD()
35         {
36             throw new NotImplementedException();
37         }
38     }
View Code

  反编译查看:

  

  EnumeratorClass只继承了接口ID,反编译查看时却看到显示是直接继承了接口IA,IB,IC,ID。

  IL代码:

  

  再去查看下ArrayList源码

  

  猜想得到验证:

  VS反编译查看源码时做了优化,会把类继承的接口以及接口的父接口都直接显示出来。

  那么我们在定义类时,继承接口的父接口会怎样?测试下。

  首先,IDE有提示,代码冗余。

  

  编译生成后,查看IL代码:

  

  跟上面一致。推测是编译时编译器把冗余代码优化掉了。

 

posted @ 2019-05-29 14:15  此树快长  阅读(644)  评论(0编辑  收藏  举报