本文章僅爲個人學習總結,如有錯誤請指正,必須看demo3。
分別介紹五個參數修飾符的名稱、效果和使用、聲明、調用等情況:
參數順序:
out、ref、默認參數->可選參數->params
區分概念:
引用類型、值類型和值傳遞和引用傳遞是兩個完全不同的概念。
全面說明參數的各種特徵:
out:
名稱:輸出參數
效果:實現將值傳遞變爲引用傳遞,並實現一個函數多個返回值
聲明:在定義函數時必須顯示的使用out來表明這個參數爲輸出參數。
調用:調用時,必須使用out來聲明這個變量是作爲輸出參數使用。
作爲參數的變量可以不進行初始化(其他所有的參數都需要初始化),也就是可以不賦值。
函數執行完前,如果有返回值,則是return 前必須進行賦值。
ref:
名稱:引用參數
效果:實現將值傳遞變爲引用傳遞,一般用於排序。
聲明:在定義函數時必須顯示的使用ref來表明這個參數爲引用參數。
調用:調用時,必須使用ref來聲明這個變量是作爲引用參數使用。
調用前,必須進行初始化。
params:
名稱:可變參數。
效果:實現參數個數不確定且沒必要進行重載。
聲明:定義在函數中最後一個參數,且只支持一個params,參數類型必須爲數組。
調用:調用時,不需要params修飾符,且可以不進行傳參。
可以,(逗號)傳遞多個或不傳遞參數,書寫方便。
可選參數:
效果:實現非必須參數的傳參麻煩性。
聲明:必須在聲明函數時,給可選參數賦默認值。
定義在函數中默認參數的最後
命名參數:
調用:命名參數只是在調用時,可以通過形(參名稱:參數值)的方式,實現不按照順序進行傳參,一般與可選參數連用,調用時必須在位置參數(正常傳參的參數,按照順序)之後。
提示:
必須理解的是out、ref、params,可選參數、命名參數看到認識即可。
應該瞭解的知識:
1.形參和實參:
形參:定義函數時,所使用的形式參數,形參在未調用前默認不佔用內存空間,調用的時候會佔用內存空間,可以通過&進行查詢形參地址。
實參:調用函數時,實際傳遞的參數。
2.值傳遞和引用傳遞
引用傳遞和值傳遞最大的區別在於可以值傳遞無法把引用傳遞給新的對象,而引用傳遞是可以的。
很難理解,看demo3。
demo1:
out的使用,兩個函數說明out特徵,細細感受這兩個函數
private void button9_Click(object sender, EventArgs e)
{
//並未初始化
double resultAdd;
double resultSub;
Calculate(10,20,out resultAdd,out resultSub);
//無法編譯,提示使用了未賦值的局部變量,也就是未初始化
double resutTestAdd;
double resultTestSub;
Test_Calculate(resutTestAdd, resultTestSub);
}
//out,計算兩個數字的和與差
public void Calculate(double numA, double numB,out double addValue,out double subValue)
{
addValue = numA + numB;
subValue = numA - numB;
}
public void Test_Calculate(double numA, double numB)
{
numA = 10;
numB = 20;
}
demo2:
params的使用
private void button10_Click(object sender, EventArgs e)
{
Add();
Add(1, 2, 3, 4, 5);
Add(new double[] { 1, 2, 3, 4, 5 });
}
public double Add(params double[] calculateNums)
{
double resultValue = 0;
for (int i = 0; i < calculateNums.Length; i++)
{
resultValue += calculateNums[i];
}
return resultValue;
}
demo3:
如果沒看懂,請看引用傳遞和值傳遞。
private void button1_Click(object sender, EventArgs e)
{
string str1 = "aBcD";
string str2 = "EfGh";
ProcessStrUpper(str1);
ProcessStrLower(ref str2);
//返回值aBcD
Console.WriteLine(str1);
//返回值efgh
Console.WriteLine(str2);
}
public void ProcessStrUpper(string str)
{
str=str.ToUpper();
}
public void ProcessStrLower(ref string str)
{
str=str.ToLower();
}