为什么不经常使用运算符过载?

时间:2010-01-20 09:29:09

标签: c# operator-overloading

在许多情况下,操作员超载可以让您更好地表达自己。为什么它们几乎不用于C#?

5 个答案:

答案 0 :(得分:11)

它们不经常使用,因为通常在大多数对象类上进行数学运算(大多数运算符都是没有意义的)。您想要的操作的语义通常在某种程度上是不同的。您不会对一堆OrderLine对象使用添加,例如,当您真正想要聚合或分组时。

要使用您在问题的注释中提供的示例,“+”似乎是将子元素放入父元素的一种不错的方式,但操作具有完全不同的语义。 “+”表示你会在数学上将它们加在一起,而实际上你的目标是在两者之间建立层次关系。它可能对你有意义,但我想在第一次阅读时,很多程序员可能并不明白。

他们很少使用,因为他们很少适合。

答案 1 :(得分:6)

它们稀有的另一个原因是,虽然函数重载可以通过函数的名称进行自我记录,并且通常通过上下文,操作符通常只有一个或两个字符长。

因此,无法明确说明过载精确地要达到的目的。例如,字符串!=比较运算符重载在其中没有空间来表示它是比较长度,执行逐字符不区分大小写的比较,还是查找静态索引数组中的值,并比较它们(尽管这是一个荒谬的例子)。

答案 2 :(得分:1)

来自http://msdn.microsoft.com/en-us/library/a1sway8w.aspx

用户定义的类型可以重载<< operator(参见operator); 第一个操作数的类型必须是用户定义的类型,第二个操作数的类型必须是int。当二元运算符被重载时,相应的赋值运算符(如果有的话)也会被隐式重载。

答案 3 :(得分:0)

我看到他们在语言中使用更多,使得易于使用DSL(特定领域语言) 一个很好的例子是PEG,它使用BNF的符号关闭:在这里,使用运算符是非常自然和富有表现力的。
Lua和Nimrod的PEG模块的Lpeg库都使用了这种功能,其中包括我认为。

答案 4 :(得分:0)

.Net中运算符重载的另一个重要问题是您无法使所有运算符超载。所以例如可以使用运营商<<>>。此外,在一些大量使用的C ++类中,还有一些不能重载。

因此,在大多数情况下,它没有意义,因为不幸的是,您无法访问所有运营商。