這一節是我錄制得最郁悶的一節
內容也比較多,而且文件也罕見的超過了4M ,所以下載肯定比較慢,請忍耐下了!!!
上節課我們看了一個對書店管理系統定義的類,如果你象大多數程序員一樣不安分的話,你肯定會想,我們先做了一個定義了默認值的構造函數,后面我們因為要多顯示書,就又改成了需要參數的了。那是否有辦法既可以使用有參數的,又可以用默認的呢?答案是肯定的!沒有!
才怪,沒有的話這節我們講什么啊,暈!事實上我們還可以使用 重載 ,也就是說我們可以定義幾個同名字的函數,只是構造方法不同,那么我們還是在昨天的基礎上改一下看看!
其實呢他不只可以重載構造函數,還可以重載方法,屬性當然是不可以的。。。
下面我們看下重載一個方法
重載構造函數和方法都很簡單(前提是你把前面的課程都聽懂了)
下面我們講一下重載運算符,重構運算符是件比較郁悶的事,希望大家注意下,因為重載的是系統定義好的那些運算符,這樣一來問題就出來了,因為很容易混淆到底這個運算符是做什么的,簡言之,他會讓代碼的易讀性降低,那你可能會問了,既然如此,我們干嗎還學呢?原因很簡單,因為在某些特定的環境下,他能夠讓代碼更加的簡潔,也就是能夠把復雜的問題給簡單化了。
所以記住 只有在運算對類型具有很直觀的意義(例如,支持表示數值的類型的兩個實例相加)的情況下,才應進行運算符重載。不應使用運算符重載為非直觀運算提供語法快捷方式。 否則很難保證三個月后你自己都搞不懂你曾經做了什么。
事實上,我們早就在用運算符重載了,記得前面我們講算術運算符的時候說到加號,它實際上就是這樣的,你看,當遇上數值型的數據,它執行的是算術運算的功能,當遇上字符串型的時候呢,他又執行的是 連接 的功能。
以下幾點轉至MSDN 的,希望大家注意看下
避免定義運算符重載,但在其用法應類似于基元(內置)類型的類型中除外。
考慮在其用法應類似于基元類型的類型中定義運算符重載。
例如,String定義運算符 == 和 !=。
在表示數字的結構(如 System.Decimal)中定義運算符重載。
在定義運算符重載時,不要偏離直觀意義。當重載運算符后運算結果非常直觀的情況下才適于進行運算符重載。例如,用一個 System.DateTime 對象減去另一個 System.DateTime 對象得到一個 System.TimeSpan 對象這一操作有直觀的意義。但是,使用邏輯 union 運算符聯合兩個數據庫查詢或使用 shift 運算符寫入流則不合適。
除非至少有一個操作數屬于定義重載的類型,否則不要提供運算符重載。
C# 編譯器強制執行這一準則。
以對稱方式重載運算符。
例如,如果重載相等運算符,也應重載不等運算符。同樣,如果重載小于運算符,也應重載大于運算符。
考慮為每個重載運算符所對應的方法提供友好的名稱。
但是,并非所有的運算符都可以被重載的,下面我抄了MSDN上的定義,大家看一下
運算符 可重載性
+、-、!、~、++、--、true 和 false
可以重載這些一元運算符。
+, -, *, /, %, &, |, ^, <<, >>
可以重載這些二進制運算符。
==, !=, <, >, <=, >=
比較運算符可以重載(但請參見本表后面的說明)。
&&, ||
條件邏輯運算符不能重載,但可使用能夠重載的 & 和 | 進行計算。
[]
不能重載數組索引運算符,但可定義索引器。
()
不能重載轉換運算符,但可定義新的轉換運算符(請參見 explicit 和 implicit)。
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
賦值運算符不能重載,但 += 可使用 + 計算,等等。
=、.、?:、->、new、is、sizeof 和 typeof
不能重載這些
當我們看這個表的時候問題又來了,如果你沒有問題的話,只能說明兩種可能,一是你對這節知識懂了,或者就是你根本就沒認真的看這個表,如果看了,那我請問,什么是一元運算符?答不出來吧,那就接著看下面的
所謂一元運算符,簡單來說,就是指計算的時候只需要一個值就可以了,例如 !IsPostBack
注意:二元運算符中必須有一個或者兩個都是屬于這個類型。
新聞熱點
疑難解答