2010-01-20 61 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。當二元運算符被重載時,相應的賦值運算符(如果有的話)也被隱式重載。

相關問題