函數參數默認值和指定傳參
最近在編寫代碼時發現介紹C#參數默認值不能像PL/SQL那樣直接設置default,網上也沒有太多詳細的資料,自己琢磨並試驗后整理成果如下:
-
C#允許在函數聲明部分定義默認值
-
參數默認值設定后,調用時可以不用填寫有默認值的參數
-
參數傳遞順序,順序調用在前,指定參數調用在后
1.默認參數設置
一般函數聲明
public void FuncPara(string a,string b)
設置默認值
public void FuncPara(string a="specify by default a",string b= "specify by default b")
public void FuncPara(string a="specify by default",string b= "specify by default") { MessageBox.Show(a +"\n"+ b+"\n"); } private void button1_Click(object sender, EventArgs e) { FuncPara(); }
此時調用函數將采用默認值
messagebox出來的是:
specify by default a
specify by default b
在調用時重寫默認參數
public void FuncPara(string a = "specify by default a", string b = "specify by default b") { MessageBox.Show(a + "\n" + b + "\n"); } private void button1_Click(object sender, EventArgs e) { FuncPara( b: "specify by call"); }
此時調用函數a將采用默認值,b的值在調用時被重寫了
messagebox出來的是:
specify by default a
specify by call
3.參數傳遞時的順序
原則先傳順序參數值,后傳指定參數,沒有指定參數的傳值全部是按照順序傳遞的
3.1順序調用
這是最基本的參數調用方式,根據參數順序傳參,順序參數在編寫和調用時應當放在前面
編寫函數首部時,有默認值參數一旦出現,后面的參數應當全部為有默認值的參數否則編譯器會報錯
public void FuncPara(string c,string a="specify by default",string b= "specify by default")
調用時
FuncPara("c","a","b");
依次向參數c,a,b傳值
錯誤寫法
public void FuncPara(string a="specify by default",string c,string b= "specify by default")
3.2指定參數調用
你可以不按照順序指定調用時的參數傳值
public void FuncPara(string a="specify by default",string b= "specify by default")
只指定b,a采用默認值
FuncPara( b: "specify by call");
messagebox出來的是:
specify by default a
specify by call
也可以不按順序:
FuncPara( b: "specify by call",a:"sdfe");
方法參數
為不具有 in、ref 或 out 的方法聲明的參數會按值傳遞給調用的方法。 可以在方法中更改該值,但當控制傳遞回調用過程時,不會保留更改后的值。 可以通過使用方法參數關鍵字更改此行為。
本部分介紹聲明方法參數時可以使用的關鍵字:
-
params 指定此參數采用可變數量的參數。
-
in 指定此參數由引用傳遞,但只由調用方法讀取。
-
ref 指定此參數由引用傳遞,可能由調用方法讀取或寫入。
-
out 指定此參數由引用傳遞,由調用方法寫入。
params(C# 參考)
使用 params
關鍵字可以指定采用數目可變的參數的方法參數。 參數類型必須是一維數組。
在方法聲明中的 params
關鍵字之后不允許有任何其他參數,並且在方法聲明中只允許有一個 params
關鍵字。
如果 params
參數的聲明類型不是一維數組,則會發生編譯器錯誤 CS0225。
使用 params
參數調用方法時,可以傳入:
- 數組元素類型的參數的逗號分隔列表。
- 指定類型的參數的數組。
- 無參數。 如果未發送任何參數,則
params
列表的長度為零。
in 參數修飾符(C# 參考)
in
關鍵字會導致按引用傳遞參數,但確保未修改參數。 它讓形參成為實參的別名,這必須是變量。 換而言之,對形參執行的任何操作都是對實參執行的。 它類似於 ref 或 out 關鍵字,不同之處在於 in
參數無法通過調用的方法進行修改。 out
參數必須由調用的方法進行修改,這些修改在調用上下文中是可觀察的,而 ref
參數是可以修改的。 在調用函數的時候in是可選的。用in聲明參數的函數可以重載。更多用法請看
static void Method(in int argument) { // implementation removed } Method(5); // OK, temporary variable created. Method(5L); // CS1503: no implicit conversion from long to int short s = 0; Method(s); // OK, temporary int created with the value 0 Method(in s); // CS1503: cannot convert from in short to in int int i = 42; Method(i); // passed by readonly reference Method(in i); // passed by readonly reference, explicitly using `in`