在许多情况下,操作员重载允许您更好地表达自己。为什么他们很难在C#中使用?为什么不更频繁地使用操作员超载?
回答
它们并不经常使用,因为在大多数类别的对象上进行数学运算(大多数运算符都是这样)通常是没有意义的。你想要的操作的语义通常在某种程度上是不同的。例如,当你真的想要聚合或分组时,你不会使用另外一些OrderLine对象。
要使用您现在在问题的注释中提供的示例,“+”看起来像是一种体面的方式,可以将子元素放入父元素,但操作具有完全不同的语义。 “+”表明你会以数学方式将它们加在一起,实际上你是在争取两者之间的层次关系。这对你来说可能是有意义的,但我想象一下,在第一次阅读时,很多程序员可能并不明显。
他们很少使用,因为他们很少适合。
谢谢加里。我在我的XmlDocument示例中的含义是将它们连接在一个xml容器中。一个更好的例子可能是:var completeXml = knifes + fork + spoons; – 2010-01-20 09:43:32
事实上,你必须解释你的意思是一个指标,它可能不是一个好主意 - 良好的代码应该是自我记录。 – 2010-03-22 08:52:14
其稀缺性的另一个原因是,尽管函数重载可以通过函数的名称进行自我记录,但通常通过上下文,操作符通常只有一个或两个字符长。
因此,无法明确清楚过载的准确目标是什么。例如,一个字符串!=比较运算符重载没有空间来说明它是比较长度,按字符大小写不区分大小写比较还是查找静态索引数组中的值,然后比较它们(虽然这是一个可笑的例子)。
我看到他们在语言中使用更多,使得DSL(域特定语言)变得容易。
一个很好的例子是PEG,它使用BNF的符号关闭:在这里,使用运算符是非常自然和表达的。
Lua和Nimrod的PEG模块的Lpeg库都使用了这个功能,其中包括我想的。
在.Net中运算符重载的另一个大问题是,您无法超载所有运算符。所以例如请注意运营商<<
或>>
。还有一些C++类中使用的很多,都不能被重载。
因此,在大多数情况下,它没有任何意义,因为您不幸的是无法访问所有操作员。
从http://msdn.microsoft.com/en-us/library/a1sway8w.aspx:
用户定义的类型可以重载< <操作者(操作者看);第一个操作数的类型必须是用户定义的类型,第二个操作数的类型必须是int。当二元运算符被重载时,相应的赋值运算符(如果有的话)也被隐式重载。
- 1. 为什么更频繁地使用Passive FTP?
- 2. 操作员超载()
- 3. ()操作员超载
- 4. 为什么Property Setter会比预期更频繁地被调用?
- 5. 为什么更频繁地读取磁盘会使Linux上的每个读取操作更快? QPS1与50
- 6. 操作员新操作员和新操作员不能重载?
- 7. 为什么Gradle需要频繁上网?
- 8. 如何“双重超载”操作员?
- 9. 有关操作员超载的问题
- 10. 为什么ASP如此频繁地编译我的视图?
- 11. 如何更频繁地更新bash_history?
- 12. 作为非朋友帮手操作员超载cout
- 13. 为什么一个控件会比另一个更频繁地重绘?
- 14. 为什么我看不到更加频繁的更严格的范围界定?
- 15. C++超载[]操作不
- 16. 使用if else的对象比较|操作员超载
- 17. UIBarButtonItem操作不起作用。为什么?
- 18. 为什么新操作员可以使用初始值?
- 19. 为什么我的或操作员不工作?
- 20. 为什么操作员LIMIT不能正常工作?
- 21. 为什么不将短路操作员设为默认
- 22. 为什么不同的操作员有不同的关联性?
- 23. 为什么subprocess.Popen.wait使用繁忙循环?
- 24. 超载非会员转换为BOOL操作
- 25. 超载引用操作
- 26. 为什么performSelector:onThread:withObject:waitUntilDone:不建议频繁的线程间通信
- 27. 让ADInterstitialAd在iPad上更频繁地加载:可能吗?
- 28. 空隙(),逗号运算符(操作员)和不可能超载
- 29. 操作员使用模板重载
- 30. 有什么办法可以加快频繁的文件写操作吗? CFile
你可以举几个例子,他们会更有表现力吗? – Joe 2010-01-20 09:30:17
关闭我的头顶:XmlDocument completeXml = customers + orders; //而不是创建一个XmlDocument并添加子元素。 – 2010-01-20 09:35:07