在許多情況下,操作員重載允許您更好地表達自己。爲什麼他們很難在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