CLR via C#:參數

命名參數:在調用函數時可以爲指定參數名設置參數值。如fun(string str)函數在調用時可以使用fun(str:“參數值”)的形式進行調用。具有以下特性:
1.在重命名參數名時也要將對應命名參數重命名一下。
2.命名參數必須出現在實參列表的最後。
3.使用ref或者out修飾參數時,命名參數必須以變量的形式進行傳遞參數。如:

Int32 num = 5
M(x:ref num)

可選參數:在設計函數時可以爲部分或者全部的參數指定默認值。具有以下特性:
1.可以爲函數,構造函數,有參屬性,委託的參數指定默認值。
2.有默認值的參數必須放在沒有默認值的參數的後面,可變參數的前面。
3.默認值必須是編譯時能確定的常量值。
4.調用函數時如果沒有爲可選參數傳遞值時就會使用默認值。
5.使用ref或者out修飾的參數由於沒有合適的默認值,所以不能設置成可選參數。
6.編譯器使用OptionalAttribute和DefaultParameterValueAttribute定製特性來設置可選參數並在元數據中持久性的存儲起來;然後將默認值傳遞給DefaultParameterValueAttribute的構造函數用來存儲起來;最後在調用函數需要用到可選參數默認值時就會從元數據中提取出來並嵌入到調用中。

隱式類型局部變量:使用var來修飾局部變量,並通過表達式來推算出局部變量的類型。具有以下特性:
1.var可以用於foreach,for,using語句,但是var不可以用於參數類型以及類型中的字段類型。
2.表達式不能爲null,否則不知道推算成什麼類型。

傳遞引用參數:CLR默認向函數參數傳值,但是也允許使用out或者ref關鍵字來向函數參數傳遞引用。具有以下特性:
1.out和ref生成的元數據是一樣的,主要是編譯器根據關鍵字的不同做不同的檢查。
2.out和ref能夠用做函數重載區分標誌,但是不能定義僅在ref和out上有差別的重載方法。
3.使用out傳遞對象給函數參數時具有以下特性:
1>.函數參數必須使用out關鍵字修飾;傳遞對象也必須使用out關鍵字修飾。
2>.傳遞對象和函數參數的類型必須一樣,且不能經過隱式或者顯示的轉換達成一樣。
3>.傳遞對象可以不用在函數外先初始化。
4>.函數內部不能讀取函數參數值,且必須在函數返回前寫入函數參數值。
4.使用ref傳遞對象給函數參數時具有以下特性:
1>.函數參數必須使用ref關鍵字修飾;傳遞對象也必須使用ref關鍵字修飾。
2>.傳遞對象和函數參數的類型必須一樣,且不能經過隱式或者顯示的轉換達成一樣。
3>.傳遞對象必須在函數外先初始化。
4>.函數內部不僅可以讀取函數參數值,也可以在函數返回前寫入函數參數值。

傳遞可變參數:使用params關鍵字來修飾函數參數。具有以下特性:
1.params關鍵字的作用是對函數參數應用ParamArrayAttribute定製特性,告知編譯器函數參數數量是可變的,類型就是函數參數指定的類型。
2.params修飾的函數參數必須是一維數組且必須位於函數參數列表的最後一個。
3.編譯器在查找函數時會優先查找非可變參數函數,找不到時纔會去找可變參數函數。
4.由於params必須修飾一維數組,而該數組不僅在堆上進行空間分配,而且也會造成垃圾回收,從而對性能造成影響。所以一般建議重載幾個常見的非可變參數版本,對十分罕見的參數傳遞才使用可變版本,從而一定程度上提高程序性能。

參數和返回類型設計規範:如下所示:
1.聲明函數的參數類型時,儘量使用弱類型,寧願要接口也不要基類。目的就是爲了讓參數類型適和更廣泛的情形。
2.聲明函數的返回類型時,儘量使用強類型,如果必須要用弱類型時也需要使用最強的弱類型。目的是讓返回類型適合更廣泛的情形。

常量性:CLR沒有提供對常量對象以及常量實參的支持。因爲如果支持的話,每次寫入進行驗證時就十分麻煩且低效;同時派生類也要爲不可變的,從而給開發人員帶來大量的麻煩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章