zoukankan      html  css  js  c++  java
  • 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代码:

      

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

  • 相关阅读:
    Android简易注解View(java反射实现)
    android注解[Jake Wharton Butter Knife]
    Android渠道汇总
    SVN管理规范
    马上着手开发iOS应用程序一 todolist
    MVC记录
    OC中intValue要注意的地方
    将从数组中取到的字符串赋值给了UIImage导致的错误
    一个null引发的错误
    记录一些容易忘记的属性 -- UITabBarController
  • 原文地址:https://www.cnblogs.com/tobeforever/p/10943096.html
Copyright © 2011-2022 走看看