標籤:nal 名稱 否則 列表 返回 service option var 傳參數
目錄
9.1 選擇性參數和具名引數
9.2 隱式類型的局部變數
9.3 以傳引用的方式向方法傳遞參數
9.4 向方法傳遞可變數量的參數
9.5 參數和傳回型別的設計規範
9.6 常量性
9.1 選擇性參數和具名引數
設計方法的參數時,可為部分或全部參數分配預設值。然後,調用這些方法的代碼可以選擇不提供部分實參,使用其預設值。此外,調用方法時可通過指定參數名稱來傳遞實參。
9.1.1 規則和原則
如果在方法中為部分參數指定了預設值,請注意一下附加的規則和原則
可為方法,構造器方法和有參屬性(C#索引器)的參數指定預設值。還可為屬於委託定義一部分的參數指定預設值。以後調用該委託類型的變數時可省略實參來接受預設值。
有預設值的參數必須放在沒有預設值的所有參數之後。“參數數組”這種參數必須放在所有參數(包括有預設值的參數)之後,而且數組本身不能有一個預設值。
預設值必須是編譯時間能確定的常量值。包括基元類型,枚舉類型以及能設為null的任何參考型別。實值型別的參數可將預設值設為實值型別的執行個體,並讓它的所有欄位都包含零值(可用default關鍵字和new關鍵字)。
不要重新命名參數變數,否則任何調用者以傳參數名的方式傳遞實參,它們的代碼也必須修改。
如果方法從模組外部調用,更改參數的預設值具有潛在的危險性。
如果參數用ref或out關鍵字進行了標識,就不能設定預設值。因為沒有辦法為這些參數傳遞有意義的預設值。
使用可選或具名引數調用方法時,還要注意以下附加的規則和原則
實參可按任意順序傳遞,但命名實參只能出現在實參列表的尾部。
可按名稱將實參傳給沒有預設值的實參,但所有必須的實參都必須傳遞。
C#不允許省略逗號之間的實參。
9.1.2 DefaultParameterValueAttribute和OptionalAttribute
在C#中,一旦為參數分配了預設值,編譯器就會在內部向該參數應用定製特性System.Runtime.InteropServices.OptionalAttribute。該特性會在最終產生的中繼資料中持久性地儲存下來。此外,編譯器向參數應用System.Runtime.InteropServices.DefaultParameterValueAttribute特性,並將該屬性持久性儲存到產生的檔案的中繼資料中。然後,會向DefaultParameterValueAttribute的構造器傳遞你在原始碼中指定常量值。之後,一旦編譯器發現某個方法調用缺失了部分實參,就可以確定省略的是可選的實參,並從中繼資料中提取預設值,將值自動嵌入調用中。
9.2 隱式類型的局部變數
C#能根據初始設定式的類型推斷方法中的局部變數的類型。
不能用var聲明方法的參數類型。因為編譯器必鬚根據在call site 傳遞的實參來推斷參數類型,但 call site 可能一個都沒有,也可能有好多個。
不能用var宣告類型中的欄位。因為欄位可以被多個方法訪問,而C#團隊認為這個協定(變數的類型)應該顯示陳述。另一個原因是一旦允許,匿名型別就會泄露到方法的外部。
9.3 以傳引用的方式向方法傳遞參數
9.4 向方法傳遞可變數量的參數
9.5 參數和傳回型別的設計規範
9.6 常量性
第九章 參數