第 22 講:方法(一):方法的概念
為了讓 C# 代碼書(shū)寫(xiě)起來(lái)更加靈活,邏輯更為嚴(yán)謹(jǐn),C# 里擁有方法(Method)這個(gè)概念。下面我們來(lái)說(shuō)一下方法的基本用法和概念。
Part 1 方法的概念
可以看到代碼寫(xiě)在 Main
我們察覺(jué)到,這樣改寫(xiě)的代碼和原始的代碼基本上是一樣的,差別就在于多了一些零部件:比如外圍的 void OutputResult
這些東西啊,return true
這些東西之類(lèi)的。上面的 InputValue
、IsPrime
和 OutputResult
這三個(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í)參。
2-2 方法的調(diào)用過(guò)程
Main
的第一行開(kāi)始。從這個(gè)例子里,第一句執(zhí)行語(yǔ)句是在這段代碼的第 4 行上。InputValue
就指的是下面方法 InputValue
的使用。數(shù)學(xué)函數(shù)里,將??帶入數(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è) 。
從語(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
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)該這么做:
a
和 b
實(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

這就是參數(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
{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
。
TryParse
后就可以簡(jiǎn)化代碼了:
這個(gè)書(shū)寫(xiě)格式可能不好理解。我們拆開(kāi)來(lái)理解。
方法有兩個(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)。
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ù)組。
顯然,以逗號(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
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è)例子:
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ò)誤。
由于 C# 的參數(shù)是可以使用 ref
、out
和 params
修飾的,因此帶有這三個(gè)修飾符的參數(shù)也可以參與重載規(guī)則進(jìn)行重載。
首先,如果兩個(gè)方法的簽名完全一致,除了 ref
和 out
修飾符一樣的話,那么它倆不構(gòu)成重載:
那么這兩個(gè)方法是不構(gòu)成重載的。但是,如果兩個(gè)方法簽名的區(qū)別只有參數(shù)的修飾符(一個(gè)有 ref
或 out
,而另外一個(gè)沒(méi)有的話),那么它們就構(gòu)成重載。
比如這樣,它們是構(gòu)成重載的。
然后是 params
params
參數(shù)必須是數(shù)組類(lèi)型,因此有點(diǎn)不同,和 ref
和 out
修飾符不能一起說(shuō)。
即使兩個(gè)參數(shù)都是相同的數(shù)組類(lèi)型,但是有沒(méi)有 params
也不會(huì)構(gòu)成重載。
比如這樣的寫(xiě)法,它倆依舊不構(gòu)成重載。
總結(jié)一下重載規(guī)則:
如果簽名里參數(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ì)給大家介紹一下遞歸的概念和用法。