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

时间:2021-07-13 09:28:20

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

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

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

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

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

  写个DEMO测试下:

     interface IA
{
int AAA();
}
interface IB : IA
{
int BBB();
}
interface IC : IB
{
int CCC();
}
interface ID : IC
{
int DDD();
}
class EnumeratorClass : ID
{
public int AAA()
{
throw new NotImplementedException();
} public int BBB()
{
throw new NotImplementedException();
} public int CCC()
{
throw new NotImplementedException();
} public int DDD()
{
throw new NotImplementedException();
}
}

  反编译查看:

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

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

  IL代码:

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

  再去查看下ArrayList源码

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

  猜想得到验证:

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

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

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

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

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

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

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