我有以下代码
class Program
{
static void Main(string[] args)
{
List<A> aList = new List<A>();
var aObj = new A();
aObj.Go(aList.Cast<IB>());
}
}
class A : IB
{
public void Go(IEnumerable<IB> interfaceList)
{
foreach (IB ibby in interfaceList)
{
Console.WriteLine("Here");
}
}
}
interface IB
{
void Go(IEnumerable<IB> interfaceList);
}
我最初尝试传递一个列表,但是 doesn't work . 经过SO的大量帮助我发现传递 IEnumerable 是将对象作为 .ofType(IB) 传递的唯一方法。
不幸的是,在我的代码中,以下行将被执行数千次:
aList.Cast<IB>();
我想知道是否有人知道它是如何通过算法(在 IL 中)实现的以及它的时间顺序是什么。
也就是说,它是否比仅强制转换每个项目的 foreach 循环更快,或者它确实是这样做的?
编辑 主类需要维护实际对象的列表。但读者只能通过界面接触它们。
最佳答案
您应该将 Go
更改为:
public void Go<T>(IEnumerable<T> interfaceList)
where T : IB
{
foreach (IB ibby in interfaceList)
{
Console.WriteLine("Here");
}
}
然后你就可以了,不需要调用 Cast
。我怀疑 Cast 的源代码实现非常简单,尽管我相信它在 3.5 和 3.5SP1 之间发生了变化。但是,它可能需要以正常的迭代器 block 方式设置新的状态机等。如果可能,最好避免它。
即使新方法是通用的,类型推断通常也会为您处理好它,因此您无需显式指定 T
。
关于c# - List<T> 转换算法和性能注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/606902/