泛型的动态调度性能

时间:2017-05-23 07:53:44

标签: c# generics dynamic dynamic-dispatch

我有超过30个类用作类Child的通用参数。这里TKind可以是约30个类的集合中的任何类。

internal sealed class Child<TKind> : Base
{
    public override void SupplyTo(IBuilder builder)
    {
        builder.AddPart((dynamic)this);
    }
}

对于我们可以拥有的所有30个案例,构建器都会AddPart超载。

这不会编译:

 builder.AddPart(this);

因为this是泛型类型,编译器无法解析方法重载。因为它不知道是否为这种通用类型提供了过载。

但是这将编译,因为我们正在使用动态调度,并且在运行时解决了方法重载。

builder.AddPart((dynamic)this);

我担心表现。 AddPart重载可能会被调用数千次。编译器在为每种泛型类型首次解决过载后优化dynamic部分吗?它是否知道this在该上下文中将始终是相同的类型?

只会首先调用每个泛型类型是一个昂贵的调用,其余的调用就像直接调用方法重载一样?

让我们举个例子。 第一种方法

 foreach(Base item in items)
 {
     builder.AddPart((dynamic)item); // dynamic dispatch
 }

我假设编译器无法优化动态调用,因为item可以是任何东西。

第二种方法

 foreach(Base item in items)
 {
     item.SupplyTo(builder); // double dispatch
 }

但是在上面的示例中我们使用了访问者模式,并且在每个泛型类中,this始终是相同的类型。那么第二种方法应该有一些优化吗?

0 个答案:

没有答案