C#中的静态(编译时/严格类型)多分派支持

Tri*_*Gao -2 c# design-patterns programming-languages visitor-pattern multimethod

我最近发现自己在我的代码中反复使用相同的模式.基本上它是访问者模式的变体,我用它来解析对派生类的基类实例的引用.这种方法需要大量的样板代码.

问题:

  • 如何在不写入大量访问者代码的情况下以静态/严格类型的方式在C#中多方式调度方法?
  • 是否有生成此代码的工具/扩展程序?
  • 为什么C#语言中没有任何内容可以解决多方调度?我不相信我是唯一发现这令人讨厌的人.我可能是非常错误的,问题不存在,所以我想知道你是怎么回事.

Eri*_*ert 11

如何在不写入大量访问者代码的情况下以静态/严格类型的方式在C#中多方式分派方法?

我不知道任何技术.

在用C#编写的C#编译器的Roslyn版本中,我们在具有数十或数百个成员的类型层次结构上使用访问者模式.我们编写了一个实用程序,它将类型的XML描述转换为类型的声明以及访问者的基类.这对我们来说似乎很有效.

是否有生成此代码的工具/扩展程序?

有; 我们自己写的.这并不难.你也可以做到的.

为什么C#作为一种语言没有解决多调度问题?

我们有一个可能的语言功能列表,比你的手臂更长.任何给定的版本我们都有预算可以做两到三个顶部,因此我们专注于获得最大的收益.

通过自动生成访问者模式,更容易实现双(或多个)虚拟调度,从未使其接近该列表的顶部.我们可以将几十种其他可能的模式嵌入到语言中,这些模式更具"爆炸性".如果您对流行语言进行调查,您会发现很少有语言通过静态分析支持双重或多重虚拟调度,并且这些语言并不是非常受欢迎.这是有原因的:首先,因为它实际上并不是一个非常有用的功能,其次,因为当你需要它时,你可以通过自己实现模式或使用动态调度来实现它.

如您所知,基于模式的方法和动态调度方法都存在重大缺陷.但是,虽然有缺点,它们都是可行的业务线,普通开发者实现自己,他们应该需要.在评估嵌入语言的模式时,我们倾向于那些普通开发人员使用基于模式的方法实现自己非常困难的模式.访客模式并不难; 它只是冗长.

例如:在C#2中,我们选择在语言中嵌入"序列生成器"模式.在C#3中,我们选择在语言中嵌入"查询理解与序列monads"模式.在C#4中,我们选择在语言中嵌入"动态调度"模式.在C#5中,我们选择将"将当前连续作为委托"模式嵌入到语言中.所有这些都是大肆宣传的例子 - 它们是实现的昂贵功能,但它们从根本上使用核心语言提供了新的编程风格.

任何版本中只有有限的努力; 在发行版中嵌入语言中的一个模式会阻止我们在该发行版中的语言中嵌入任何其他模式,因为根本没有预算来执行此操作.

将"双(或多个)虚拟调度"模式嵌入到语言中成为花费预算最佳方式时,我们会这样做,而不是之前.因此,您应该期待漫长的等待.

  • @bonomo - 我怀疑有更多的开发人员因为与Office互操作的困难而受到伤害,而不是因为写访问者的困难而受到伤害.我并不认为`dynamic`是一个令人兴奋或有趣的功能,但我可以看到为什么许多C#开发人员会这样做. (2认同)