params 關(guān)鍵字可以指定在參數(shù)數(shù)目可變處采用參數(shù)的方法參數(shù)。
示例:
字面意思比較難懂,所以看示例很有用。
// keywords_params.csusing System;class App{public static void UseParams(params object[] list){for (int i = 0; i < list.Length; i++){Console.WriteLine(list[i]);}}static void Main(){// 一般做法是先構(gòu)造一個對象數(shù)組,然后將此數(shù)組作為方法的參數(shù)object[] arr = new object[3] { 100, 'a', "keywords" };UseParams(arr);// 而使用了params修飾方法參數(shù)后,我們可以直接使用一組對象作為參數(shù)// 當(dāng)然這組參數(shù)需要符合調(diào)用的方法對參數(shù)的要求UseParams(100, 'a', "keywords");Console.Read();}}
ref 關(guān)鍵字使參數(shù)按引用傳遞。其效果是,當(dāng)控制權(quán)傳遞回調(diào)用方法時,在方法中對參數(shù)所做的任何更改都將反映在該變量中。
示例:
按引用傳遞值類型是有用的,但是 ref 對于傳遞引用類型也是很有用的。這允許被調(diào)用的方法修改該引用所引用的對象,因為引用本身是按引用來傳遞的。
// keywords_ref.csusing System;class App{public static void UseRef(ref int i){i += 100;Console.WriteLine("i = {0}", i);}static void Main(){int i = 10;// 查看調(diào)用方法之前的值Console.WriteLine("Before the method calling: i = {0}", i);UseRef(ref i);// 查看調(diào)用方法之后的值Console.WriteLine("After the method calling: i = {0}", i);Console.Read();}}/*控制臺輸出:Before the method calling : i = 10i = 110After the method calling: i = 110*/
C# ref與out區(qū)別
在C# 中,既可以通過值也可以通過引用傳遞參數(shù)。通過引用傳遞參數(shù)允許函數(shù)成員更改參數(shù)的值,并保持該更改。若要通過引用傳遞參數(shù), 可使用ref或out關(guān)鍵字。ref和out這兩個關(guān)鍵字都能夠提供相似的功效,其作用也很像C中的指針變量。它們的區(qū)別是:
1、使用ref型參數(shù)時,傳入的參數(shù)必須先被初始化。對out而言,必須在方法中對其完成初始化。
2、使用ref和out時,在方法的參數(shù)和執(zhí)行方法時,都要加Ref或Out關(guān)鍵字。以滿足匹配。
3、out適合用在需要retrun多個返回值的地方,而ref則用在需要被調(diào)用的方法修改調(diào)用者的引用的時候。
注:在C#中,方法的參數(shù)傳遞有四種類型:傳值(by value),傳址(by reference),輸出參數(shù)(by output),數(shù)組參數(shù)(by array)。傳值參數(shù)無需額外的修飾符,傳址參數(shù)需要修飾符ref,輸出參數(shù)需要修飾符out,數(shù)組參數(shù)需要修飾符params。傳值參數(shù)在方法調(diào)用過程中如果改變了參數(shù)的值,那么傳入方法的參數(shù)在方法調(diào)用完成以后并不因此而改變,而是保留原來傳入時的值。傳址參數(shù)恰恰相反,如果方法調(diào)用過程改變了參數(shù)的值,那么傳入方法的參數(shù)在調(diào)用完成以后也隨之改變。實際上從名稱上我們可以清楚地看出兩者的含義--傳值參數(shù)傳遞的是調(diào)用參數(shù)的一份拷貝,而傳址參數(shù)傳遞的是調(diào)用參數(shù)的內(nèi)存地址,該參數(shù)在方法內(nèi)外指向的是同一個存儲位置。
方法參數(shù)上的 ref 方法參數(shù)關(guān)鍵字使方法引用傳遞到方法的同一個變量。當(dāng)控制傳遞回調(diào)用方法時,在方法中對參數(shù)所做的任何更改都將反映在該變量中。
若要使用 ref 參數(shù),必須將參數(shù)作為 ref 參數(shù)顯式傳遞到方法。ref 參數(shù)的值被傳遞到 ref 參數(shù)。
傳遞到 ref 參數(shù)的參數(shù)必須最先初始化。將此方法與 out 參數(shù)相比,后者的參數(shù)在傳遞到 out 參數(shù)之前不必顯式初始化。
屬性不是變量,不能作為 ref 參數(shù)傳遞。
如果兩種方法的聲明僅在它們對 ref 的使用方面不同,則將出現(xiàn)重載。但是,無法定義僅在 ref 和 out 方面不同的重載。
out
方法參數(shù)上的 out 方法參數(shù)關(guān)鍵字使方法引用傳遞到方法的同一個變量。當(dāng)控制傳遞回調(diào)用方法時,在方法中對參數(shù)所做的任何更改都將反映在該變量中。
當(dāng)希望方法返回多個值時,聲明 out 方法非常有用。使用 out 參數(shù)的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數(shù)。
若要使用 out 參數(shù),必須將參數(shù)作為 out 參數(shù)顯式傳遞到方法。out 參數(shù)的值不會傳遞到 out 參數(shù)。
不必初始化作為 out 參數(shù)傳遞的變量。然而,必須在方法返回之前為 out 參數(shù)賦值。
屬性不是變量,不能作為 out 參數(shù)傳遞。