• 沒有找到結果。

方法參數的種類 方法參數的種類 方法參數的種類 方法參數的種類

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

相關文件