C#是单一派遣还是多种派遣语言?

时间:2009-01-26 14:17:40

标签: c# programming-languages multiple-dispatch single-dispatch

我正在努力了解单个和多个调度是什么。

我刚看过这个:
http://en.wikipedia.org/wiki/Multiple_dispatch

从我的定义中可以看出,C#和VB.Net是多分派的,即使在编译时选择了哪个重载调用。

我在这里是对的,还是我错过了什么? 谢谢!

8 个答案:

答案 0 :(得分:40)

好的,我理解函数重载与多调度不同的细微差别。

基本上,区别在于在运行时或编译时选择调用哪个方法。现在,我知道每个人都这么说,但是没有一个明确的例子,这听起来非常明显,因为C#是静态类型的,并且多个调度语言(显然对我来说,至少)似乎是动态类型的。到目前为止,只有这个定义,多调度和函数重载对我来说听起来完全一样。

这会产生真正差异的情况是当你有一个方法的2个重载,它们在参数类型上有所不同,但是这两个类型是多态的,并且你用一个声明为更高类型的引用来调用一个较低类型的对象...... (如果有人能想出更好的表达方式,请随时编辑此答案)

示例:

int CaptureSpaceShip(IRebelAllianceShip ship) {}
int CaptureSpaceShip(XWing ship) {}

void Main() { 
  IRebelAllianceShip theShip = new XWing();
  CaptureSpaceShip(theShip);
}

XWing显然实现了IRebelAllianceShip。 在这种情况下,将调用第一个方法,而如果C#实现了多个调度,则将调用第二个方法。

对于doc rehash感到抱歉......在我看来,这是解释这种差异的最明确方式,而不仅仅是阅读每种调度方法的定义。

有关更正式的解释: http://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_is_more_than_function_overloading

答案 1 :(得分:18)

对于那些使用搜索引擎发现本文的人,C#4.0引入了dynamic关键字。代码如下所示。

int CaptureSpaceShip(IRebelAllianceShip ship) {}
int CaptureSpaceShip(XWing ship) {}

void Main() {   
    IRebelAllianceShip theShip = new XWing();  
    CaptureSpaceShip((dynamic)theShip);
}

答案 2 :(得分:5)

C#是单一发送,但有一些博客文章,他们的标题看起来像他们试图模仿多方法。如果我可以加载其中一篇文章,我会在这里更新我的答案。

答案 3 :(得分:2)

C#不支持多次发送。访问者设计模式模拟可以描述为多个调度的内容,即使访问者模式主要侧重于将算法与层次结构分开。

答案 4 :(得分:1)

根据cited Wikipedia article,根据定义,多个分派基于所涉及对象的运行时类型,因此C#和VB.net 使用它,因为正如您所说,在编译时做出决定。

答案 5 :(得分:0)

GoF访客模式是如何进行双重调度的示例。 Scott Meyers“更有效的C ++”向您展示了如何在C ++中实现它。这是来自Dobbs博士的link,它讨论了如何在Java和C ++中进行双重调度。

答案 6 :(得分:0)

我知道这是一个老问题。

在.Net 4.0中,您可以对多种方法使用dynamic关键字...请查看以下示例.Net 4.0 Optimized code for refactoring existing "if" conditions and "is" operator

答案 7 :(得分:0)

也许有人会对使用动态关键字(MSDN blog

的多个调度的 C#示例感兴趣

维基百科说C#4.0(动态)是"多次派遣"语言。我还认为Java,C#(4.0之前),C ++等语言都是单一调度。