【发布时间】:2017-09-18 19:43:03
【问题描述】:
作为 C# 的新手,我知道运算符重载的目的和用途,并且我可以看到它有时在非常特殊的情况下是多么优雅,例如否定一个值对象以一次否定它的所有字段,但是这样的事情总是可以用简单的说话方法来完成。是否有一些标准可以用作指导,何时或是否重载运算符或何时简单地使用方法?我找不到类似的东西,所以这只是品味/编程范式/风格的问题吗?
【问题讨论】:
-
我从未听说过任何描述如何在运算符和方法之间进行选择的指南。但是在使用 C# 和 .Net 几年后,我很少看到运算符重载(== 和 != 除外)。
-
如果我的问题的所有其他解决方案(我能想到的)都是荒谬的,我当然会这样做。永远不要说永远,但是在十年的专业编写 C# 中,我不记得有这样的案例。
-
我认为这主要是个人喜好。我们的 C# 代码库有一些核心几何类型(向量、点、方向),这些几何类型具有重载运算符以支持交叉/点积、转换等。我认为像这样的基本数据类型是有意义的,但在大多数情况下会避免它.
-
如果您正在编写算术原语(如有理数、复数或向量/矩阵类型),强制用户使用静态方法来描述简单的转换很快就会变得笨拙。
p0 = r * u - Axis + origin;比p0 = Point.Add( Vector.Subtract( Vector.Multiply( r, u ), Axis ), origin );更具可读性。我唯一一次在代数上下文之外使用运算符重载是在编写解析器生成器时,我重载了|来表示替代方案(并重载&来表示序列)。 -
我想说,如果你正在寻找一个指导方针,那就是:如果你希望用户想要形成复杂的表达式并且这些表达式有一个完善的表示法,那么重载运算符可能是合适的.
标签: c# operator-overloading overloading paradigms