1

我有 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总是相同的类型。所以第二种方法应该有一些优化?

4

0 回答 0