c#語言中有幾種參數類型,這邊做個簡單的總結,供大家參考和學習。
1、具名參數
具名參數顧名思義就是出具參數的名字,在調用有參數的方法時,我們需要根據參數的順序和類型給參數賦值,否則程序就會報錯的。而具名參數就可以打破這種約束,使用起來也是非常的簡單:
public int Reduce(int fir , int sec){
return fir - sec;
}
public void Demo()
{
//普通調用
Reduce(15, 12);
//具名調用
Reduce(sec:12,fir:15); // 13
}
具名參數有這麼幾點好處:首先他可以在一定程度上增加程序的可讀性,前提是參數的名稱不要亂寫,一定要有意義;還有一點就是可以不受參數位置的約束。
2、可選參數
可選參數在實際的開發中很有用武之地的,也是非常的簡單易用,說白了就是給參數設置默認值。同樣,我們通過一個簡單的例子來看一下:
public string UserInfor(string name = "mac", string age = "27", string tel = "18888888888")
{
return "我的名字是" + name + ",我今年" + age + "歲,我聯繫方式:" + tel;
}
public void Demo()
{
string ss = UserInfor(); //我的名字是mac,我今年27歲,我聯繫方式:18888888888
string ss1 = UserInfor(name: "maaici"); //我的名字是maaici,我今年27歲,我聯繫方式:18888888888
string ss2 = UserInfor(age: "18"); //我的名字是mac,我今年18歲,我聯繫方式:18888888888
string ss3 = UserInfor(tel: "18852999999"); //我的名字是mac,我今年27歲,我聯繫方式:18852999999
}
我在平時的開發中常會有這樣一個場景:想修改或者拓展一個現有的方法,但是有很多地方調用,有了可選參數我們就可以對方法進行拓展,而不用改變原先的調用代碼,也不用重新寫一個類似的方法,產生冗餘代碼。
另外,可選參數必須在所有必需參數的後面!
3、this 參數
this 參數最主要的用途就是爲目標類型拓展方法。關於拓展方法我的另外一個文章中有過詳細的介紹,附帶簡單的例子供參考用。請戳:拓展方法的定義及調用和微軟拼音組件的使用
4、值參數和引用參數
這兩個類型的參數放在一起來介紹。首先我們要把值參數、引用參數和C#的值類型和引用類型區分開來,這並不是同一個東西,對於值類型個引用類型,我推薦一篇文章,感興趣的同學可以去學習一下:https://www.cnblogs.com/bakuhert/articles/5878086.html。
引用參數和值參數的區別在於是否有ref關鍵字來修飾,不加ref的參數統稱爲值參數。值參數就是常說的傳值參數,當我們把一個變量的值作爲方法的參數傳遞給方法,其實是在方法中創建了一個副本,在方法中對這個副本的各種修改都不會影響方法外面的那個本尊(有例外,下面會強調)。但是我們有時候就是需要在方法裏面的修改,同步到本尊,就需要引用變量出馬了。下面用代碼來簡答的說明一下
static void Main(string[] args)
{
int number = 1314;
Console.WriteLine("我現在是:" + number);
Add100(number);
Console.WriteLine("我現在是:" + number);
Add1000(ref number);//這邊也必須要加上 ref 關鍵字
Console.WriteLine("我現在是:" + number);
Console.ReadLine();
}
public static void Add100(int num)//傳值參數
{
num += 100;
}
public static void Add1000(ref int num)//引用參數
{
num += 1000;
}
結果:
剛剛上面說了傳值參數會有例外的情況,那麼就是在給值參數傳遞引用參數的時候,請看代碼:
class Program
{
static void Main(string[] args)
{
Person maaici = new Person { NAME = "maaici", AGE = 26 };
Console.WriteLine("我的名字是:" + maaici.NAME + ",今年" + maaici.AGE + "歲。");
ChangeYourName(maaici);
Console.WriteLine("我的名字是:" + maaici.NAME + ",今年" + maaici.AGE + "歲。");
Console.ReadLine();
}
public static void ChangeYourName(Person person) {
person.NAME = "曾阿牛";
}
}
public class Person {
public string NAME { get; set; }
public int AGE { get; set; }
}
大家猜一下,我到底是誰?
6、輸出參數
輸出參數是用out關鍵字修飾的參數。我們都知道一個方法至多就只能有一個返回值,有時候我們會需要有多個返回值,這時我們就可以使用輸出參數。我個人的覺得輸出參數和引用參數很像,都可以改變傳進方法的變量本身,有時候我們甚至可以換着用。但是有一個區別,引用參數必須是賦值過的參數,否則會報錯,但是輸出參數卻可以使用沒有賦值的變量,並且輸出參數原來的值將變得沒有意義,因爲在有輸出參數的方法中,必須要對變量進行賦值。
7、參數數組
參數數組有的也叫可變參數,用params 關鍵字來修飾。主要用途是我們不知道參數的類型有多少個的情況下,避免重複多次的重載下使用的,有一個經典的例子,一起看一下:
private static void Main(string[] args)
{
//可以一個一個輸
Console.WriteLine("最大的數字是:" + GetMaxNumber(2,3,34,54,232,32,232,32,45,65665,757));
//也可以直接傳一個數組
int[] numbers = new int[] { 2, 3, 34, 54, 232, 32, 232, 32, 45, 65665, 757 };
Console.WriteLine("最大的數字是:" + GetMaxNumber(numbers));
Console.ReadKey();
}
public static int GetMaxNumber(params int[] nums) {
int maxNum = -99999;
if (nums.Length > 0) {
foreach (int item in nums) {
if (maxNum < item)
maxNum = item;
}
}
return maxNum;
}
在使用可變參數的有以下幾個注意點:
1、若形參表中含一個參數數組,則該參數數組必須位於形參列表的最後。
2、不允許將params修飾符與ref和out修飾符組合起來使用。
3、參數數組必須是一維數組。
4、與參數數組對應的實參可以是同一類型的數組名,也可以是任意多個與該數組的元素屬於同一類型的變量。
5、若實參是數組則按引用傳遞,若實參是變量或表達式則按值傳遞。
6、有參數數組的方法的優先級要小於沒有參數數組的重載。例如:
private static void Main(string[] args)
{
//以下調用兩個重載都沒問題,但是他優先調用沒有參數數組的重載。
string retMsg = DoSomeThing("我沒用", "我沒用");
Console.WriteLine(retMsg); //結果是 : 我沒有參數數組
Console.ReadKey();
}
public static string DoSomeThing(string str1,string str2) {
return "我沒有參數數組。";
}
public static string DoSomeThing(params string[] strs)
{
return "我有參數數組。";
}
以上是對C#參數的整理,如果有錯誤,請幫忙指出。
下一講:C#第五講:類和成員的訪問修飾符