我有 30 多个类用作类的通用参数Child
。这里TKind
可以是大约 30 个类中的任何类。
internal sealed class Child<TKind> : Base
{
public override void SupplyTo(IBuilder builder)
{
builder.AddPart((dynamic)this);
}
}
构建器AddPart
对我们可以拥有的所有 30 个案例都有超载。
这不会编译:
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
总是相同的类型。所以第二种方法应该有一些优化?