Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的静态(编译时/严格类型)多分派支持#_C#_Design Patterns_Programming Languages_Visitor Pattern_Multimethod - Fatal编程技术网

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

C# C中的静态(编译时/严格类型)多分派支持#,c#,design-patterns,programming-languages,visitor-pattern,multimethod,C#,Design Patterns,Programming Languages,Visitor Pattern,Multimethod,我最近发现自己在代码中反复使用相同的模式。基本上,它是访问者模式的一种变体,我使用它将对基类实例的引用解析为派生类。这种方法需要大量的样板代码 问题: 如何以静态/严格类型的方式在C#中多分派一个方法,而不编写大量的访问者代码 是否有生成此代码的工具/扩展 为什么C语言中没有解决多调度问题的语言?我不相信我是唯一一个觉得这很烦人的人。我可能大错特错了,而且这个问题并不存在,所以我想知道你是怎么处理的 如何以静态/严格类型的方式在C#中多分派一个方法,而无需编写大量的访问者代码 我不知道这方面

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

问题:

  • 如何以静态/严格类型的方式在C#中多分派一个方法,而不编写大量的访问者代码
  • 是否有生成此代码的工具/扩展
  • 为什么C语言中没有解决多调度问题的语言?我不相信我是唯一一个觉得这很烦人的人。我可能大错特错了,而且这个问题并不存在,所以我想知道你是怎么处理的
如何以静态/严格类型的方式在C#中多分派一个方法,而无需编写大量的访问者代码

我不知道这方面有什么技巧

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

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

有,;我们自己写的。这并不难。你也可以这样做

为什么作为一种语言,C#不能解决多分派问题

我们有一个可能的语言特征列表,这些特征实际上比你的手臂长。任何给定的版本,我们都有预算去做其中的两到三个,最多,因此我们专注于获得最可能的回报

通过自动生成访问者模式使实现双重(或多重)虚拟分派变得更容易,这从来没有使它接近列表的顶部。我们可以在语言中嵌入几十种其他可能的模式,这些模式更“划算”。如果您对流行语言进行调查,您会发现很少有语言通过静态分析支持双重或多重虚拟分派,而支持双重或多重虚拟分派的语言也不是非常流行。这是有原因的:第一,因为它实际上不是一个非常有用的特性,第二,因为当您确实需要它时,您可以通过自己实现模式或使用动态调度来实现它

正如您所注意到的,基于模式的方法和动态调度方法都有明显的缺点。但是,尽管有缺点,但对于普通业务线开发人员来说,如果需要的话,它们都是可行的。在评估要嵌入到语言中的模式时,我们倾向于那些普通开发人员很难使用基于模式的方法实现自己的模式。游客模式并不难;只是冗长而已

例如:在C#2中,我们选择在语言中嵌入“序列生成器”模式。在C#3中,我们选择在语言中嵌入“带有序列单子的查询理解”模式。在C#4中,我们选择在语言中嵌入“动态调度”模式。在C#5中,我们选择将“作为委托传递当前延续”模式嵌入到语言中。所有这些都是“赚钱赚大钱”的例子——它们的实现成本很高,但它们从根本上使新的编程风格在核心语言中可用

在任何版本中,可用的工作量都是有限的;在一个版本的语言中嵌入一个模式会阻止我们在该版本的语言中嵌入任何其他模式,因为根本没有这样做的预算


当将“双重(或多重)虚拟分派”模式嵌入到语言中成为花费预算的最佳方式时,我们会这样做,而不是在之前。因此,你应该期待一个漫长的等待。

你不是在几个小时前才问这个问题吗?这个问题听起来像是在咆哮。也许你可以就“已知的替代方案”的问题展开辩论并举出实际的例子。如果你想将这些问题传达给C#团队,那么你应该直接与他们展开对话。@bonomo:首先,我认为你会发现很少有语言实现了多个虚拟分派,而那些实现了多个虚拟分派的语言并不是非常流行的语言。这是有原因的;与成本相比,它实际上并不是一个有用的功能。其次,我不同意将动态分派添加到C#是一种浪费资源的说法。强调动态分派:在不严格需要静态键入的情况下,例如在Web视图中,它允许一些非常简单的代码。当我在ASP.net MVC中工作时,它对我产生了巨大的影响,尤其是一个允许控制器返回匿名类型作为视图模型的技巧。@bonomo-我怀疑,与编写访问者的困难相比,更多的开发人员因为与Office互操作的困难而受到伤害。我个人并不认为
dynamic
是一个令人兴奋或有趣的功能,但我可以理解为什么许多C#开发者会这么做。@bomono VB.NET将是开发人员的合适工具,他们的头脑不会因为VB.NET中的所有关键字而受到伤害。我在VB6和OfficeVBA上编程时遇到了麻烦,但我发现VB.NET非常冗长。C#的动态特性是类似品味的C#开发人员的工具。