【问题标题】:Operator overloading - why static resolve?运算符重载 - 为什么要静态解析?
【发布时间】:2011-12-15 21:00:01
【问题描述】:

静态解决重载运算符的原因是什么?对我来说,这似乎是一个奇怪的选择——我能想到的唯一优势是性能的小幅提升(但有时 JIT 也可能会避免这种情况),但代价是一些相当不直观的行为——即我基本上必须将操作员转发到一个虚函数来获得想要的行为。

这是刚刚从 C++ 接管还是有其他一些好的原因?

【问题讨论】:

标签: c# operator-overloading


【解决方案1】:

请参阅 Eric Lipperts 的文章 Why are overloaded operators always static in C#?

相反,在面对潜在的语言功能时,我们应该问自己的问题是“该功能的引人注目的好处是否足以证明所有成本都是合理的?”成本远远超过设计、开发、测试、记录和维护功能的普通美元成本。还有更微妙的代价,比如,这个特性会不会让未来改变类型推断算法变得更加困难?这是否会导致我们进入一个如果不引入向后兼容性中断就无法进行更改的世界?以此类推。

在这种特定情况下,引人注目的好处很小。如果您想在 C# 中使用虚拟调度的重载运算符,您可以非常轻松地从静态部分构建一个。 [...]

可以支持基于实例的运算符,但 C# 语言设计者并没有看到与使其正常工作所需的努力相比的巨大收益。

【讨论】:

  • 我发誓 Eric 在他所有与 C# 设计相关的文章中复制并粘贴第一段 :-)
  • 权威人士提供的关于该主题的很好的链接,是的,他对那里的一些可能的陷阱是正确的(然后解决方案无论如何都很简单 - 只是没有我想要的那么优雅)。跨度>
【解决方案2】:

考虑为引用类型重载运算符时的情况。它可以是运算符两侧的null

如果运算符是实例方法,它们将不起作用。

【讨论】:

  • 但是 Scala 允许对引用类型进行“运算符重载”:x * y 与解析后的 Scala 中的 x.multiply(y) 没有什么不同。
  • 刚刚提出了一个反论点 :) 另外,我在这里一直使用 Nullable 类型,不知道它们在哪里适合所有这些:(int)?10 > (int?)null ... 最后是有道理的,但是仍然造成了一些悲伤:(
  • 是的,您显然必须至少指定如何评估参数(尽管x op y 成为x.op(y) 似乎是合乎逻辑的选择)。不过,我可以看到关于不对称的争论。
【解决方案3】:

我想到了两件事,恕我直言,其中任何一件都足以自行破坏交易:

  1. 哪些运算符? 二元运算符有两个操作数,基于两个参数类型的动态调度不可用! “经典”virtual 方法仅根据 this 的运行时类型进行调度。
  2. 证明额外复杂性合理的用例是什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多