【问题标题】:C# overloading resolution?C#重载决议?
【发布时间】:2010-05-29 03:32:48
【问题描述】:

来自文章Anders Hejsberg interview,“我们在 C# 中进行重载解析的方式不同于任何其他语言” 有人可以提供一些 C# 和 Java 的例子吗?

【问题讨论】:

  • 我将从 Eric Lippert's 博客开始。有 8 个帖子标记为 overload resolution
  • 为什么需要一个例子?在 Java 中,您可以轻松地替换子类中的函数,在 C# 中,您将函数标记为虚拟,然后可以覆盖它。
  • @R0MANARMY:这是这个问题的正确答案。如果您将其发布为答案,我会投票赞成。
  • @James:那是覆盖,而不是重载
  • @Robert Harvey:我觉得这是一个半途而废的答案。 SO上有很多人可以比“阅读X”更详细地回答这个问题。上述答案的内容对 SO 也更有价值。

标签: c#


【解决方案1】:

Anders 的意思是,最初的设计团队明确设计了重载解决算法,以使其具有与版本控制场景很好地配合的某些属性,即使当您考虑没有版本控制的场景时,这些属性看起来倒退或令人困惑。

可能最常见的例子是 C# 中的规则,即如果派生度更高的类上的任何方法是适用的候选者,它会自动优于派生度较低的类上的任何方法,即使less-derived 方法具有更好的签名匹配。据我所知,这条规则在其他具有重载决议的语言中并不存在。这似乎违反直觉;如果有更好的签名匹配方法,为什么不选择它呢?原因是因为更好的签名匹配方法可能已在以后的版本中添加,因此会引入“脆弱的基类”故障。

有关各种语言如何处理脆弱的基类故障的更多想法,请参阅

http://blogs.msdn.com/b/ericlippert/archive/tags/brittle+base+classes/

有关重载解决方案的更多想法,请参阅

http://blogs.msdn.com/b/ericlippert/archive/tags/overload+resolution/

【讨论】:

  • 当问题中提到您的名字时,您是否会被寻呼,以确保无论一天中的什么时间都能得到回答;) ?
  • C++ 会自动隐藏所有具有相同名称的函数,如果一个函数是在一个更派生的类中定义的。因此,除非您使用“使用 base::functionname”声明(再次“取消隐藏”名称),否则效果是相似的。但它并不完全相同,因为在 C++ 中根本不会考虑那些隐藏的名称,即使在更派生的类中没有重载适用。不过,它的用途相同 - 不会无意中调用基类中的新函数。
【解决方案2】:

C# 处理重载的方式从内部角度来看是不同的。

安德斯的完整引述:

我一直把自己描述为 务实的家伙。这很有趣,因为 版本控制最终成为其中之一 我们语言设计的支柱。它 显示在您如何覆盖虚拟 C# 中的方法。另外,我们的做法 C# 中的重载解析不同 来自我所知道的任何其他语言,因为 版本控制的原因。每当我们 看着设计一个特定的 功能,我们总是会交叉检查 带版本控制。我们会问:“如何 版本控制会改变这一点吗?如何 此功能来自版本控制 观点?”事实证明,大多数 之前的语言设计已经给出了非常 没想到。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-02-25
  • 2011-03-26
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2011-05-08
相关资源
最近更新 更多