• 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代码:

      

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

  • 相关阅读:
    powermock测试
    一些疑惑
    Java基础总结3
    Java学习路线
    Java基础总结2
    关于我
    翻转单词序列
    和为s的两个数字
    和为s的连续正数序列
    数组中只出现一次的数字
  • 原文地址:https://www.cnblogs.com/tobeforever/p/10943096.html
Copyright © 2020-2023  润新知