今天在看ArrayList,发现一个很有意思的问题。从VS里反编译看,ArrayList继承了ICollection、 IEnumerable、IList和ICloneable,而IList又继承了ICollection和IEnumerable, ICollection又继承了IEnumerable。见下图:
接口是成员的签名,继承接口的父接口并没有意义,微软应该不会写这种代码。所以怀疑这只是反编译显示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();
}
}
反编译查看:
EnumeratorClass只继承了接口ID,反编译查看时却看到显示是直接继承了接口IA,IB,IC,ID。
IL代码:
再去查看下ArrayList源码:
猜想得到验证:
VS反编译查看源码时做了优化,会把类继承的接口以及接口的父接口都直接显示出来。
那么我们在定义类时,继承接口的父接口会怎样?测试下。
首先,IDE有提示,代码冗余。
编译生成后,查看IL代码:
跟上面一致。推测是编译时编译器把冗余代码优化掉了。