五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

第 22 講:方法(一):方法的概念

2021-04-06 17:14 作者:SunnieShine  | 我要投稿

為了讓 C# 代碼書(shū)寫(xiě)起來(lái)更加靈活,邏輯更為嚴(yán)謹(jǐn),C# 里擁有方法(Method)這個(gè)概念。下面我們來(lái)說(shuō)一下方法的基本用法和概念。

Part 1 方法的概念

我們思考一下前面文章里書(shū)寫(xiě)的一個(gè)例子:求質(zhì)數(shù)。輸入一個(gè)數(shù),然后求這個(gè)數(shù)字是否是一個(gè)質(zhì)數(shù)。

可以看到代碼寫(xiě)在 Main 里,搞得代碼相當(dāng)臃腫。如果我們將每一個(gè)部分的邏輯分離開(kāi)來(lái),代碼在可讀性上就會(huì)有所提升。

我們察覺(jué)到,這樣改寫(xiě)的代碼和原始的代碼基本上是一樣的,差別就在于多了一些零部件:比如外圍的 void OutputResult 這些東西啊,return true 這些東西之類(lèi)的。上面的 InputValue、IsPrimeOutputResult 這三個(gè)東西就是我們這里稱(chēng)的方法。

我們?cè)俅问褂萌绱说膬?nèi)容,將 Main 整體重新改寫(xiě)一下:

代碼雖然更多了,但是 Main 里簡(jiǎn)潔了很多。下面我們來(lái)說(shuō)一下每一個(gè)零部件的具體概念。

Part 2 方法的書(shū)寫(xiě)格式以及用法

我們用三個(gè)示意圖給大家展示一下方法里的相關(guān)名稱(chēng)。

2-1 基本概念羅列

下面來(lái)羅列一下上面圖上給出的術(shù)語(yǔ)詞的整理列表:

  • 方法(Method):就是 C 語(yǔ)言的函數(shù)(Function)。用于提取單獨(dú)的邏輯行為的一段邏輯過(guò)程;

  • 簽名(Signature):方法的聲明。包含方法的返回值、方法的參數(shù)表列;

  • 方法體(Method Body):方法具體指示執(zhí)行邏輯的這一大段代碼;

  • 返回語(yǔ)句(Return Statement):指示整個(gè)方法最終的表達(dá)結(jié)果。你可以把一個(gè)表達(dá)式類(lèi)比成一個(gè)方法,而把返回結(jié)果理解成一個(gè)表達(dá)式的最終表現(xiàn)出來(lái)的那個(gè)數(shù)值。返回語(yǔ)句就是在方法里指示返回結(jié)果的固定語(yǔ)句;

  • 返回值類(lèi)型(Return Type):表示這個(gè)方法本身到底應(yīng)該表現(xiàn)出什么類(lèi)型的結(jié)果數(shù)值。和前面這個(gè)概念類(lèi)似,你也可以類(lèi)比表達(dá)式:表達(dá)式本身的數(shù)值的類(lèi)型就稱(chēng)為這里的返回值類(lèi)型;

  • 形式參數(shù)(Parameter):方法本身所需要的、參與運(yùn)算過(guò)程的數(shù)值信息。參數(shù)可以有多個(gè),都以分號(hào)分隔。一般也簡(jiǎn)稱(chēng)參數(shù)或者形參

  • 參數(shù)類(lèi)型(Parameter Type):表示參數(shù)本身的類(lèi)型。參數(shù)和返回值類(lèi)似,需要傳入的數(shù)值信息需要預(yù)先給定類(lèi)型才能參與計(jì)算過(guò)程;如果不知道類(lèi)型,就無(wú)法知道怎么進(jìn)行運(yùn)算過(guò)程;

  • 參數(shù)名稱(chēng)(Parameter Name):表示參數(shù)本身的名稱(chēng)。你可以理解成數(shù)學(xué)函數(shù)里的自變量;

  • 參數(shù)表列(也叫參數(shù)列表,Parameter List):小括號(hào)里那一堆形式參數(shù),整體就叫參數(shù)表列;

  • 實(shí)際參數(shù)(Argument):在方法體里,將形式參數(shù)帶入運(yùn)算的時(shí)候,那個(gè)變量被稱(chēng)為實(shí)際參數(shù)。實(shí)際參數(shù)也被簡(jiǎn)稱(chēng)為實(shí)參。

梳理完畢了術(shù)語(yǔ)詞后,我們來(lái)說(shuō)一下執(zhí)行流程。

2-2 方法的調(diào)用過(guò)程

首先,我們最開(kāi)始就說(shuō)過(guò),C# 的程序從 Main 的第一行開(kāi)始。從這個(gè)例子里,第一句執(zhí)行語(yǔ)句是在這段代碼的第 4 行上。InputValue 就指的是下面方法 InputValue 的使用。數(shù)學(xué)函數(shù)里,將?f(x)?帶入數(shù)值進(jìn)去計(jì)算,就稱(chēng)為函數(shù)的調(diào)用(Call)。這里,int val = InputValue(); 這個(gè)語(yǔ)句在執(zhí)行的時(shí)候,由于在調(diào)用 InputValue 方法,因此會(huì)讓代碼跳轉(zhuǎn)到下方的具體代碼里去執(zhí)行。而 InputValue 就相當(dāng)于數(shù)學(xué)函數(shù)的這個(gè) f

從語(yǔ)法上講,由于 InputValue 本身是無(wú)需外界給定任何數(shù)值參與運(yùn)算過(guò)程的,因此調(diào)用處(一般叫調(diào)用方,Caller)的小括號(hào)里不寫(xiě)東西;如果需要數(shù)值參與計(jì)算(即有參數(shù)的方法)的話,就必須在小括號(hào)里對(duì)位寫(xiě)上變量或者字面量信息,參與運(yùn)算。變量和字面量必須一一對(duì)應(yīng)下面方法簽名里參數(shù)類(lèi)型的順序。比如第一個(gè)參數(shù)是 int 類(lèi)型的,那么在調(diào)用的時(shí)候,第一個(gè)參數(shù)傳入進(jìn)去的數(shù)值必須是 int 類(lèi)型的變量,或者是一個(gè) int 的整數(shù)字面量。

可以看到,下方 InputValue 方法實(shí)際上就是在做“讀入一個(gè)數(shù)值”的運(yùn)算操作。如果數(shù)值讀取失敗(比如輸入了字母 a 之類(lèi)的)的話,就會(huì)觸發(fā)拋出一個(gè) FormatException 異常類(lèi)型。這是我們之前就說(shuō)過(guò)的。接著,如果數(shù)值讀取成功的話,那么必然不會(huì)觸發(fā)異常,因此會(huì)走到下一句,執(zhí)行 break 語(yǔ)句跳出死循環(huán)。

最后,一旦跳出死循環(huán)后,數(shù)值結(jié)果將通過(guò) return 語(yǔ)句返回出來(lái)。從邏輯上講,你可以理解為,這里寫(xiě)的結(jié)果就是數(shù)學(xué)函數(shù)里自變量帶入后的運(yùn)算結(jié)果數(shù)值;當(dāng)然在編程里面,你可以認(rèn)為,是把上方的調(diào)用方 InputValue() 整體用這里的返回結(jié)果作一個(gè)替換。比如說(shuō) return 3 就暗示了上方 int val = InputValue() 將被替換為 int val = 3。

同樣地,下面的方法調(diào)用也是完全一樣的使用方式。

從另一個(gè)角度來(lái)說(shuō),我們完全可以把方法當(dāng)成和數(shù)學(xué)函數(shù)一樣的存在。不過(guò) C# 語(yǔ)法更為靈活,因此可能它和數(shù)學(xué)函數(shù)有一點(diǎn)不同,但你可以認(rèn)為,方法是數(shù)學(xué)函數(shù)的推廣版本。

2-3 void 返回值類(lèi)型

稍微注意一下的是,返回值是 void 類(lèi)型是什么意思呢?

void 類(lèi)型,也稱(chēng)空類(lèi)型,表示整個(gè)方法不返回結(jié)果。不返回結(jié)果意思就是在告訴你,它的使用和數(shù)學(xué)函數(shù)不同:數(shù)學(xué)函數(shù)必然帶入數(shù)值后就會(huì)產(chǎn)生一個(gè)結(jié)果數(shù)值;而 void 返回值類(lèi)型的方法,在帶入數(shù)值的時(shí)候(或者也可能是沒(méi)有參數(shù)的方法),方法不會(huì)返回任何數(shù)值作為表達(dá)式結(jié)果。因此,這樣的方法完全等價(jià)于“把方法體里的代碼直接抄到調(diào)用方里”的這么一個(gè)過(guò)程。只是有一點(diǎn)不同的是,方法里可以傳入?yún)?shù),在“直接抄寫(xiě)回調(diào)用方”的時(shí)候,參數(shù)要用原始帶入的數(shù)值作一個(gè)替換。

總之,void 返回值類(lèi)型就是一個(gè)沒(méi)有返回值類(lèi)型的方法。它完全等價(jià)于“只是純粹提取了一些執(zhí)行邏輯”。在使用的時(shí)候,和 a++ 這樣的語(yǔ)句一樣,直接將調(diào)用過(guò)程寫(xiě)上去后,以分號(hào)結(jié)尾就可以了。

2-4 static 是個(gè)什么鬼(超綱)

目前來(lái)說(shuō),我們無(wú)法解釋 static 的具體語(yǔ)義。你可以先記住。如果你寫(xiě)了新的方法,就必須追加 static 這個(gè)關(guān)鍵字在方法簽名前。如果你不追加 static 的話,雖然這個(gè)方法本身來(lái)說(shuō),語(yǔ)法其實(shí)也沒(méi)有錯(cuò),但如果在 Main 里使用這個(gè)沒(méi)有標(biāo)記 static 的方法,是會(huì)產(chǎn)生編譯錯(cuò)誤的:它會(huì)告訴你,static 方法里無(wú)法調(diào)用非 static 方法。

2-5 方法名取名的問(wèn)題

一般來(lái)說(shuō),方法名是一個(gè)標(biāo)識(shí)符。換句話說(shuō),標(biāo)識(shí)符是自定義寫(xiě)入代碼的一種特殊的存在。而方法名的取名是采用帕斯卡命名法的。這樣取名使得代碼里的這個(gè)名稱(chēng)更加清晰。

如果你不使用帕斯卡命名法,對(duì)于寫(xiě)代碼來(lái)說(shuō),是沒(méi)有問(wèn)題的,它僅僅是一個(gè)軟性規(guī)定。但是,大家都用帕斯卡命名法,你卻不這么用,別人肯定會(huì)罵你寫(xiě)代碼沒(méi)有好習(xí)慣。

另外,參數(shù)一般是駝峰命名法,這意味著你需要以小寫(xiě)開(kāi)頭參數(shù)名稱(chēng)。比如前面的 isPrime 啊、number 之類(lèi)的。

2-6 Main 方法

我們一直都用 Main 來(lái)確定整個(gè)程序執(zhí)行的邏輯過(guò)程。程序總是從 Main 的大括號(hào)開(kāi)始執(zhí)行,然后從后大括號(hào)結(jié)束程序執(zhí)行。Main 是由系統(tǒng)規(guī)定指定的程序固定的方法,因此你無(wú)法改變 Main 的名稱(chēng)。比如你把 Main 改成 main 甚至是別的,都是不允許的。

Part 3 參數(shù)修飾

3-1 引用參數(shù)

下面我們來(lái)思考一些比較復(fù)雜的問(wèn)題。在上述的使用方法的過(guò)程,比如 IsPrime(val) 這個(gè)調(diào)用方的寫(xiě)法,它是直接將 val 的數(shù)值傳入進(jìn)去,帶入?yún)⑴c運(yùn)算的。C# 有一點(diǎn)比較人性化的地方就在于,帶入計(jì)算的數(shù)值是復(fù)制一份進(jìn)去參與計(jì)算;換句話說(shuō),帶入的數(shù)值和原始數(shù)值只是在數(shù)值上是完全一樣的,而在實(shí)際使用的時(shí)候,它們倆毫無(wú)關(guān)系(val 變量和方法體內(nèi)使用的這個(gè)數(shù)值):你甚至可以在方法體內(nèi)修改這個(gè)參數(shù)的數(shù)值信息,但實(shí)際上修改 了這個(gè)數(shù)值,依舊不會(huì)影響調(diào)用方傳入的這個(gè) val 本身存儲(chǔ)的數(shù)值。

這就產(chǎn)生了一個(gè)問(wèn)題。假設(shè)我們要交換兩個(gè)變量?jī)?nèi)部存儲(chǔ)的數(shù)值信息的話,我們寫(xiě)的代碼本應(yīng)該這么做:

我們使用最簡(jiǎn)單的三變量交換方式來(lái)交換 ab 存儲(chǔ)的數(shù)值。當(dāng)我們?cè)谡{(diào)用這個(gè)方法的時(shí)候:

實(shí)際上,結(jié)果是多少呢?實(shí)際上你看到的是一個(gè)令人沮喪的結(jié)果:

不對(duì)啊。按道理是交換了的,但為什么沒(méi)變化呢?這是因?yàn)榍拔恼f(shuō)過(guò),變量交換變動(dòng)數(shù)值也只變動(dòng)傳入的這個(gè)復(fù)制的結(jié)果。它和原始的變量本身存儲(chǔ)的數(shù)值是無(wú)關(guān)的,它僅僅是復(fù)制了一份過(guò)來(lái)而已。

為了解決上面這種“方法體內(nèi)變動(dòng)會(huì)影響變量原始數(shù)據(jù)”的問(wèn)題,我們可以使用 C# 里的一個(gè)關(guān)鍵字 ref。此時(shí)我們變動(dòng)的地方有兩處:方法簽名和方法調(diào)用方。

首先是方法簽名。

然后是方法調(diào)用方。

我們?cè)谡{(diào)用方參數(shù)位置上,以及簽名上都追加 ref 關(guān)鍵字,這暗示參數(shù)是“引用傳遞”的。所謂的引用傳遞,就是數(shù)值會(huì)影響到原始傳入的那個(gè)變量上。這樣一來(lái),我們就可以看到結(jié)果改變了:

這就是參數(shù)前面追加 ref 的效果。我們也把這樣追加了 ref 關(guān)鍵字的參數(shù)稱(chēng)為引用參數(shù)(或者直接叫 ref 參數(shù)也行,By-reference Parameter);另外,從影響角度來(lái)說(shuō),如果標(biāo)記了 ref 的話,我們肯定不能在調(diào)用方傳入字面量了。因?yàn)樽置媪渴菬o(wú)法被修改的存在。

3-2 輸出參數(shù)

3-2-1 基本用法

考慮另外一種情況。假設(shè)我要寫(xiě)一個(gè)方法,傳入三個(gè)參數(shù)分別是數(shù)學(xué)、英語(yǔ)和語(yǔ)文的成績(jī),然后計(jì)算成績(jī)的平均數(shù),并返回平均數(shù)是否超過(guò) 60 分(平均數(shù)是不是及格了)。

大家都知道,數(shù)學(xué)函數(shù)有一個(gè)特效就是,函數(shù)只能有一個(gè)函數(shù)值,帶入一個(gè)數(shù)據(jù),然后得到一個(gè)結(jié)果。因?yàn)閿?shù)學(xué)上約定限制了計(jì)算結(jié)果只能是唯一的,因此 C 語(yǔ)言和 C# 延續(xù)了這一點(diǎn):方法(C 語(yǔ)言里叫函數(shù))只能有一個(gè)返回值。

那么,像是這個(gè)方法,一旦寫(xiě)成代碼,我們既要獲取平均數(shù),又要獲取是否及格的信息,顯然就無(wú)法完成了。C# 里提供了另外一種方法模型:在參數(shù)上追加 out 關(guān)鍵字,來(lái)告訴編譯器,這個(gè)參數(shù)是從函數(shù)體內(nèi)部往外“輸出”用的。那么,上述這個(gè)問(wèn)題我們可以這么寫(xiě)代碼:

而在調(diào)用方,我們這么寫(xiě)代碼:

注意方法簽名的第四個(gè)參數(shù),我們標(biāo)記 out,這表示這個(gè)數(shù)值本身是通過(guò)方法體里計(jì)算得到該數(shù)據(jù),然后反饋給調(diào)用方的過(guò)程;而返回值,用 bool 就行(表示是否及格,及格了就用 true;沒(méi)及格就用 false 表示就行)。

然后,在輸出的時(shí)候,{0} 占位符用下面的這個(gè)條件運(yùn)算符替換:只要 passed 變量是 true,那么就用“has passed”(通過(guò)考試)替換掉;否則用否定“hasn't passed”(沒(méi)通過(guò)考試);而第二個(gè)占位符 {1:0.00}average 變量的數(shù)值替換即可。

你會(huì)問(wèn),“欸,不對(duì)啊,average 初始數(shù)值都沒(méi)有,哪里來(lái)的結(jié)果顯示?”。還記得 out 關(guān)鍵字嗎?標(biāo)記到了第四個(gè)參數(shù)上后,在調(diào)用方我們也用了這個(gè)關(guān)鍵字。這個(gè)時(shí)候,average 就會(huì)自動(dòng)在 IsPassedTheExam 方法里計(jì)算得到,然后直接從方法體里得到結(jié)果傳給這個(gè)第四個(gè)參數(shù),然后再傳給這里的 average 接收這個(gè)結(jié)果。

你可能又會(huì)問(wèn),“剛不是說(shuō)了,參數(shù)的用法不是傳入數(shù)值嗎?怎么這里還能帶出來(lái)數(shù)據(jù)?”。這就是 out 參數(shù)的用途。只要追加了 out 之后,結(jié)果就直接會(huì)從方法體里計(jì)算得到,然后反饋回去。因此,它改變了參數(shù)的語(yǔ)義。這種參數(shù)就稱(chēng)為輸出參數(shù)(也可以直接叫 out 參數(shù),Out parameter)。

另外,你需要注意兩點(diǎn)。第一,輸出參數(shù)傳入的這個(gè)變量名最開(kāi)始是可以不用賦值的。比如這個(gè)例子里,調(diào)用方傳入的 average 就沒(méi)有初始數(shù)值。當(dāng)然,你也可以賦初始值,但沒(méi)有意義。因?yàn)樽罱K執(zhí)行了方法后,這個(gè)變量的數(shù)值也會(huì)被系統(tǒng)自動(dòng)替換掉,因此原始的數(shù)值有沒(méi)有根本沒(méi)有關(guān)系。第二,既然是 out 參數(shù),那么傳入的參數(shù)依然是不能寫(xiě)字面量的。都是輸出參數(shù)了,數(shù)據(jù)顯然要反饋給變量來(lái)接收才行。傳入一個(gè)字面量當(dāng) out 參數(shù)肯定是錯(cuò)誤用法。

3-2-2 系統(tǒng)自帶的方法:TryParse

在之前,我們介紹了 Parse 方法的用法。不管是什么類(lèi)型,只要加了 .Parse 就可以將字符串轉(zhuǎn)換成真正的運(yùn)算的數(shù)字。不過(guò),我們經(jīng)常寫(xiě) try-catch 會(huì)讓程序變得很臃腫。C# 提供了一種新的方法:TryParse。這個(gè)方法封裝了 try-catch。

這是我們經(jīng)常書(shū)寫(xiě)的一種模式:讀入一個(gè)數(shù)值。數(shù)值讀取失敗就死循環(huán),直到讀取成功為止?,F(xiàn)在,我們有了 TryParse 后就可以簡(jiǎn)化代碼了:

這個(gè)書(shū)寫(xiě)格式可能不好理解。我們拆開(kāi)來(lái)理解。

int.TryParse 方法有兩個(gè)參數(shù),并帶有一個(gè) bool 的返回值。第一個(gè)參數(shù)傳入的是 string 類(lèi)型的字符串內(nèi)容,用來(lái)轉(zhuǎn)換;第二個(gè)參數(shù)是 out 參數(shù),用來(lái)表示和接收轉(zhuǎn)換結(jié)果;返回值是 bool 結(jié)果,表示是否轉(zhuǎn)換成功。如果轉(zhuǎn)換失?。ū热缯f(shuō)輸入了 a 字母之類(lèi)的),這個(gè)方法就會(huì)返回 false。

整個(gè)表達(dá)式,傳入了 Console.ReadLine() 表示我們輸入的字符串,直接傳進(jìn)去轉(zhuǎn)換。轉(zhuǎn)換失敗就會(huì)返回 false;返回 false 后,由于條件前有 ! 表示取反,因此反而會(huì)成立,于是執(zhí)行循環(huán)體。循環(huán)體沒(méi)有東西,只有一個(gè)空語(yǔ)句,因此又自動(dòng)返回到條件處判斷。條件里還是那樣,因此又需要輸入一個(gè)字符串,然后轉(zhuǎn)換字符串,直到轉(zhuǎn)換成功;取反后條件是 false,循環(huán)條件不成立,跳出循環(huán)。

可以發(fā)現(xiàn),整個(gè)執(zhí)行流程和前面的寫(xiě)法完全是一樣的,一點(diǎn)區(qū)別都沒(méi)有。但后者寫(xiě)起來(lái)更簡(jiǎn)潔了,這就是 TryParse 方法的好處。正是因?yàn)檫@個(gè)方法帶有一個(gè) out 參數(shù),因此我們專(zhuān)門(mén)放在這里講解。

3-3 變長(zhǎng)參數(shù)

還記得 C 語(yǔ)言里變長(zhǎng)參數(shù)的用法嗎?C 語(yǔ)言里,變長(zhǎng)參數(shù)允許在同一個(gè)函數(shù)里傳入很多參數(shù),以逗號(hào)隔開(kāi)就行。在聲明這樣的函數(shù)的時(shí)候,我們用的是三個(gè)小數(shù)點(diǎn)。

這么做有一個(gè)比較麻煩的地方。因?yàn)閰?shù)是變長(zhǎng)的,這就使得我們參數(shù)傳入的時(shí)候需要使用 va_list、va_arg 之類(lèi)的東西來(lái)參與函數(shù)內(nèi)部處理。這是相當(dāng)麻煩的。那么,C# 里為了解決這種問(wèn)題,它發(fā)明了一種特別簡(jiǎn)單的格式:params 關(guān)鍵字。

我們直接在方法參數(shù)上追加 params 關(guān)鍵字,就可以表示這個(gè)參數(shù)是變長(zhǎng)參數(shù)。

另外,變長(zhǎng)參數(shù)必須是數(shù)組來(lái)接收。因?yàn)槊恳粋€(gè)變量都是具有相同的數(shù)值類(lèi)型的,你不能傳入完全不同的數(shù)值類(lèi)型進(jìn)去(沒(méi)有意義),因此 C# 要求,傳入的結(jié)果既然是相同的類(lèi)型的東西,那么就用數(shù)組來(lái)接收它們,因此修飾了 params 的話,參數(shù)必須是一個(gè)一維數(shù)組。

我們還需要注意一點(diǎn)。調(diào)用方是這么調(diào)用的:

顯然,以逗號(hào)分隔開(kāi)參數(shù),和原始參數(shù)傳入的過(guò)程是完全一致的。這樣就會(huì)產(chǎn)生語(yǔ)義沖突。如果我傳入兩個(gè)參數(shù)進(jìn)去,一個(gè)是普通的參數(shù),一個(gè)是 params 修飾的參數(shù)。那么,混用參數(shù)就會(huì)導(dǎo)致語(yǔ)義不明確:到底哪個(gè)部分是變長(zhǎng)參數(shù)的部分呢?

因此,C# 規(guī)定,變長(zhǎng)參數(shù)(params 關(guān)鍵字)只能修飾在方法參數(shù)表列的最后一個(gè)參數(shù)上。因此,這么一來(lái),語(yǔ)法就能確定了:

然后在調(diào)用方:

這里的 useless 是 3,而后面的一大坨都是 params 變長(zhǎng)參數(shù)的部分。

順帶一提,參數(shù)傳入是可以不用的。比如這里的 useless 在方法體里就沒(méi)有用到。語(yǔ)法是沒(méi)有錯(cuò)誤的,你這么用不會(huì)影響程序運(yùn)行。只是說(shuō),多傳入了一個(gè)無(wú)用的參數(shù),有點(diǎn)影響代碼閱讀。

如果你記不住 params 這個(gè)單詞,你可以這么想:它是 parameters 的縮寫(xiě)。param 是參數(shù)的縮寫(xiě),s 則是后綴,表示參數(shù)是復(fù)數(shù)形式,暗示變長(zhǎng)參數(shù)。

Part 4 方法的重載

4-1 基本重載規(guī)則

方法的重載(Overload)實(shí)際上就是寫(xiě)若干個(gè)名稱(chēng)完全一樣,但參數(shù)表列不同的方法。返回值類(lèi)型是不是一樣的,跟方法重載無(wú)關(guān)。

舉個(gè)例子:

這三個(gè)方法的名稱(chēng)完全一樣,但參數(shù)表列不同:一個(gè)沒(méi)有參數(shù),一個(gè)有一個(gè) int 類(lèi)型參數(shù),一個(gè)有兩個(gè)參數(shù)。因此,三者構(gòu)成重載。重載方法的意義在于,我們無(wú)需考慮取名規(guī)則,可以使得相同功能但參數(shù)不同的方法名稱(chēng)可以是一樣的。

不過(guò)請(qǐng)注意,返回值是否相同,并不會(huì)影響重載規(guī)則。換句話說(shuō),即使只有返回值不同,兩個(gè)方法依然不構(gòu)成重載。

比如這兩個(gè) A 方法,一個(gè)不返回任何數(shù)值,而另外一個(gè)則需要返回?cái)?shù)值。由于只有返回值類(lèi)型不同,因此它們并不構(gòu)成重載。

構(gòu)成重載的話,編譯器不會(huì)管你使用方法;但是不構(gòu)成重載的話,編譯器會(huì)認(rèn)為你這么寫(xiě)是不行的,因此會(huì)產(chǎn)生編譯器錯(cuò)誤。

4-2 參數(shù)修飾重載規(guī)則

由于 C# 的參數(shù)是可以使用 ref、outparams 修飾的,因此帶有這三個(gè)修飾符的參數(shù)也可以參與重載規(guī)則進(jìn)行重載。

首先,如果兩個(gè)方法的簽名完全一致,除了 refout 修飾符一樣的話,那么它倆不構(gòu)成重載:

那么這兩個(gè)方法是不構(gòu)成重載的。但是,如果兩個(gè)方法簽名的區(qū)別只有參數(shù)的修飾符(一個(gè)有 refout,而另外一個(gè)沒(méi)有的話),那么它們就構(gòu)成重載。

比如這樣,它們是構(gòu)成重載的。

然后是 params 參數(shù)。由于 params 參數(shù)必須是數(shù)組類(lèi)型,因此有點(diǎn)不同,和 refout 修飾符不能一起說(shuō)。

即使兩個(gè)參數(shù)都是相同的數(shù)組類(lèi)型,但是有沒(méi)有 params 也不會(huì)構(gòu)成重載。

比如這樣的寫(xiě)法,它倆依舊不構(gòu)成重載。

總結(jié)一下重載規(guī)則:

  • 如果簽名里只有參數(shù)個(gè)數(shù)不同的話,構(gòu)成重載;

  • 如果簽名里參數(shù)個(gè)數(shù)相同,但參數(shù)類(lèi)型不同的話,構(gòu)成重載;

  • 如果簽名里只有返回值類(lèi)型不同的話,不構(gòu)成重載;

  • 如果簽名的參數(shù)類(lèi)型一致,只是一方有 ref 或者 out 修飾符,一方?jīng)]有的話,構(gòu)成重載;

  • 如果簽名的參數(shù)類(lèi)型一致,只是參數(shù)的修飾符不同(一方用 ref 另外一方用 out),不構(gòu)成重載;

  • 如果簽名的參數(shù)類(lèi)型一致,只是一個(gè)有 params,另外一個(gè)沒(méi)有,不構(gòu)成重載。

Part 5 總結(jié)

本節(jié)給大家介紹了方法的基本概念,以及相關(guān)的使用。下一節(jié)我們會(huì)給大家介紹一下遞歸的概念和用法。


第 22 講:方法(一):方法的概念的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
张家港市| 滨州市| 上思县| 凤阳县| 时尚| 土默特左旗| 邛崃市| 灵寿县| 贡嘎县| 收藏| 枣强县| 汾西县| 星子县| 武清区| 锦屏县| 页游| 碌曲县| 衡水市| 彭州市| 博兴县| 清水河县| 瓮安县| 岚皋县| 克东县| 蓬莱市| 嘉禾县| 仙居县| 公安县| 枞阳县| 如东县| 岢岚县| 琼海市| 金华市| 盖州市| 临清市| 蒲城县| 南华县| 万年县| 奈曼旗| 阿拉尔市| 平塘县|