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 }
反编译查看:
EnumeratorClass只继承了接口ID,反编译查看时却看到显示是直接继承了接口IA,IB,IC,ID。
IL代码:
再去查看下ArrayList源码:
猜想得到验证:
VS反编译查看源码时做了优化,会把类继承的接口以及接口的父接口都直接显示出来。
那么我们在定义类时,继承接口的父接口会怎样?测试下。
首先,IDE有提示,代码冗余。
编译生成后,查看IL代码:
跟上面一致。推测是编译时编译器把冗余代码优化掉了。