《Inside C 》筆記 五 方法

2021-08-02 20:18:29 字數 1297 閱讀 4844

方法用來體現類的行為。

一 相關概念

a) ref和out

通常乙個方法只能返回乙個值,但如果確實需要返回多個值時,可以使用ref或out。如果方法的引數被標註為ref或out,在呼叫該方法時,會傳遞對應的引數的指標,而不僅僅是引數的值。

ref和out的區別在於:ref引數在被傳遞前必須初始化,out引數則不需要。

b) 方法過載 overloading

有了方法過載,就可以宣告具有不同引數型別或個數的同名方法,可以讓類的使用更靈活。另外方法過載對於建構函式也非常有用,因為建構函式名稱需要與類的名稱一致,如果需要宣告多個建構函式,就只能用過載了。

過載的一組方法必須具有不同的引數,如果引數相同、返回值不同,則不能形成過載。

c) 可變引數

如果無法在編碼時事先確定引數的個數,就可以使用可變引數,然後由系統在執行時確定。

d) 靜態方法

靜態方法存在於類的整個生命週期中,不必例項化也可以呼叫。一些比較通用的功能可以作為靜態方法,封裝成工具類。

二 方法的重寫

a) 如果派生類需要修改從基類繼承的方法,可以使用重寫override。最基本的重寫可以使用new關鍵字。之前不知道new還有這一用處。public new或new public都可以。

b) 但使用new關鍵字這種重寫方式只適合在派生類直接重寫基類的場合。如果涉及到多型,比如將派生類視作基類,但同時又希望使用派生類重寫後的方法時,new關鍵字就無能為力了。例如有基類employee和方法calculatepay,同時派生類employeea中使用new關鍵字重寫了calculatepay方法,編譯後的il碼會直接指向基類的calculatepay()

產生這種現象是由於編譯器進行了「早繫結」early binding。在**編譯時,編譯器會尋找對calculatepay()的呼叫,並確定呼叫calculatepay()時會跳轉到的位址,使用new的寫法時,編譯器會直接指定跳轉到基類的calculatepay()位址。

c) 那麼如何使派生類使用自己重寫的方法呢?可以使用virtual和override關鍵字,這兩個關鍵字可以告知編譯器進行「晚繫結」late binding,在執行時才確定要呼叫calculatepay()時要跳轉的位址。在基類的方法上新增virtual以及在派生類的相應方法上新增override後,il碼變成了如下:

callvirt表示編譯時calculatepay()方法的位址未知,只有在執行時根據具體的派生類來確定

Lambda(五) 方法引用

方法引用 方法引用就是讓我們根據已有的方法建立lambda表示式,假如乙個lambda表示式只是單純的呼叫一下這個方法,那麼我們就可以省去描述的步驟,直接用名稱進行呼叫。語法 目標引用 方法名稱其中 是分隔符 等效方法引用不需要加上括號,因為並沒有實際呼叫這個方法。主要的三類方法引用 1.指向靜態方...

初學c 讀書筆記(五) 方法A

1 方法結構 方法是一塊具有名稱的 可以使用方法名執行 也可以把資料傳入方法並接收資料輸出。方法的特徵 方法是否返回資料,如果返回,返回什麼型別 方法名什麼型別的輸入可以傳入方法 方法體包含可以執行 的語句序列。intsum intvar1,intvar2 2 本地變數 本地變數用於儲存本地的或臨時...

《GO語言聖經》讀書筆記(五) 方法

本節讀書筆記對應原書第六章。在函式宣告時,在其名字之前放上乙個變數,就是乙個方法。package geometry import math type point struct func p point distance q point float64 func distance q,p point ...