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