C#第4講:輕鬆應對C#的幾種參數類型

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#第五講:類和成員的訪問修飾符

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