1.10 類的方法 類的方法 類的方法 類的方法
1.10.2 方法參數的種類 方法參數的種類 方法參數的種類 方法參數的種類
C#語言的方法可以使用如下四種參數(請注意和參數型別的區別):
傳值參數,不含任何修飾符。
傳參照參數,以 ref 修飾符宣告。
輸出參數,以 out 修飾符宣告。
參量參數,以 params 修飾符宣告。
1. 傳值參數
當用傳值參數向方法傳遞參數時,程序複製實參的值,並且將此副本傳遞給該方法,被調 用的方法不會修改實參的值,所以使用傳值參數時,可以保證實參的值是安全的。如果參數型
別是參照型別,例如是類的參照變數,則副本中儲存的也是對象的參照,所以副本和實參引用 同一個對象,通過這個副本,可以修改實參所引用的對象中的資料成員。
2. 傳參照參數
有時在方法中,需要修改或得到方法外部的變數值,C 語言是向方法傳遞實參指標來達到 目的,而 C#語言是用傳參照參數。當用傳參照參數向方法傳遞實參時,程序將把實參的參照,
即實參在記憶體中的地址傳遞給方法,方法通過實參的參照(地址),修改或得到方法外部的變 數值。傳參照參數以 ref 修飾符宣告。注意在使用前,實參變數必須被設置初始值。
3. 輸出參數
為了把方法的運算結果保存到外部變數,因此需要知道外部變數的參照(地址)。輸出參數 用於向方法傳遞外部變數參照(地址),所以輸出參數也是傳參照參數,與傳參照參數的差別在 於調用方法前無需對變數進行初始化。在方法返回後,傳遞的變數被認為經過了初始化。傳值 參數、傳參照參數和輸出參數的用法見下例:
using System;
class g{ public int a = 0; }//類定義 class Class1
{
public static void F1(ref char i)//傳參照參數 { i = 'b';}
public static void F2(char i)//傳值參數,參數型別為實值型別 { i = 'd';}
public static void F3(out char i)//輸出參數 { i = 'e';}
public static void F4(string s)//傳值參數,參數型別為字串 { s = "xyz";}
public static void F5(g gg)//傳值參數,參數型別為參照型別 { gg.a = 20;}
public static void F6(ref string s)//傳參照參數,參數型別為字串 { s = "xyz";}
static void Main(string[] args) {
char a = 'c';
string s1 = "abc";
F2(a);//傳值參數,不能修改外部的 a
Console.WriteLine(a);//因 a 未被修改,顯示 c F1(ref a);//傳參照參數,函數修改外部的 a 的值 Console.WriteLine(a);//a被修改為 b,顯示 b char j;
F3(out j);//輸出參數,結果輸出到外部變數 j
Console.WriteLine(j);//顯示 e
F4(s1);//傳值參數,參數型別是字串,s1 為字串參照變數 Console.WriteLine(s1);//顯示:abc,字串 s1 不被修改 g g1 = new g();
F5(g1);//傳值參數,但實參是一個類參照型別變數
Console.WriteLine(g1.a.ToString());//顯示:20,修改對象資料 F6(ref s1);//傳參照參數,參數型別是字串,s1 為字串參照變數 Console.WriteLine(s1);//顯示:xyz,字串 s1 被修改
} } 4. 參量參數
參量參數使用 params修飾符,如果形參列中包含了參量參數,那麼它必須是參數表中最 後一個參數,參量參數只允許是一維陣列。比如 string[]和 string[][]型別都可以作為參量型參 數。最後,參量型參數不能再有 ref 和 out 修飾符。見下例:
using System;
class Class1 {
static void F(params int[] args)//參量參數,有 params 修飾符 {
Console.Write("Array contains {0} elements:", args.Length);
foreach (int i in args)
Console.Write(" {0}", i);
Console.WriteLine();
}
static void Main(string[] args) {
int[] a = {1, 2, 3};
F(a);//實參為陣列類參照變數 a
F(10, 20, 30, 40);//等價於 F(new int[] {60, 70, 80, 90});
F(new int[] {60, 70, 80, 90});//實參為陣列類參照 F();//等價於 F(new int[] {});
F(new int[] {});//實參為陣列類參照,陣列無元素 }
}
程序輸出
Array contains 3 elements: 1 2 3
Array contains 4 elements: 10 20 30 40 Array contains 4 elements: 60 70 80 90
Array contains 0 elements:
Array contains 0 elements:
方法的參數為陣列時也可以不使用 params,此種方法可以使用一維或多維陣列,見下例:
using System;
class Class1 {
static void F(int[,] args)//傳值參數,參數型別為陣列類參照變數,無 params 修飾 {
Console.Write("Array contains {0} elements:", args.Length);
foreach (int i in args)
Console.Write(" {0}", i);
Console.WriteLine();
}
static void Main(string[] args) {
int[,] a = {{1, 2, 3}, {4, 5, 6}};
F(a);//實參為陣列類參照變數 a
//F(10, 20, 30, 40);//此格式不能使用
F(new int[,] {{60, 70},{80, 90}});//實參為陣列類參照 //F();//此格式不能使用
//F(new int[,] {});//此格式不能使用 }
}
程序輸出
Array contains 3 elements: 1 2 3 4 5 6 Array contains 4 elements: 60 70 80 90