我有超过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
始终是相同的类型。那么第二种方法应该有一些优化吗?