2010-01-20 57 views
3

在许多情况下,操作员重载允许您更好地表达自己。为什么他们很难在C#中使用?为什么不更频繁地使用操作员超载?

+3

你可以举几个例子,他们会更有表现力吗? – Joe 2010-01-20 09:30:17

+0

关闭我的头顶:XmlDocument completeXml = customers + orders; //而不是创建一个XmlDocument并添加子元素。 – 2010-01-20 09:35:07

回答

11

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

要使用您现在在问题的注释中提供的示例,“+”看起来像是一种体面的方式,可以将子元素放入父元素,但操作具有完全不同的语义。 “+”表明你会以数学方式将它们加在一起,实际上你是在争取两者之间的层次关系。这对你来说可能是有意义的,但我想象一下,在第一次阅读时,很多程序员可能并不明显。

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

+0

谢谢加里。我在我的XmlDocument示例中的含义是将它们连接在一个xml容器中。一个更好的例子可能是:var completeXml = knifes + fork + spoons; – 2010-01-20 09:43:32

+4

事实上,你必须解释你的意思是一个指标,它可能不是一个好主意 - 良好的代码应该是自我记录。 – 2010-03-22 08:52:14

6

其稀缺性的另一个原因是,尽管函数重载可以通过函数的名称进行自我记录,但通常通过上下文,操作符通常只有一个或两个字符长。

因此,无法明确清楚过载的准确目标是什么。例如,一个字符串!=比较运算符重载没有空间来说明它是比较长度,按字符大小写不区分大小写比较还是查找静态索引数组中的值,然后比较它们(虽然这是一个可笑的例子)。

0

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

0

在.Net中运算符重载的另一个大问题是,您无法超载所有运算符。所以例如请注意运营商<<>>。还有一些C++类中使用的很多,都不能被重载。

因此,在大多数情况下,它没有任何意义,因为您不幸的是无法访问所有操作员。

+1

你可以在C#中过载运算符。 – dan04 2010-03-22 07:54:03

+0

@ dan04:没有。比较两个列表。 – Oliver 2010-03-22 08:25:52

1

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

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

相关问题