You are on page 1of 24

Chapter 15 委派與索引子 1

Chapter 15
委派與索引子
______________________________________________

委派

索引子

委派的作用類似於 C 和 C++中的函式指標,並且可以將函式
當成參數傳遞。索引子主要使用於當類別中的資料成員是集
合或是陣列形式時,利用索引子的特性,可以把類別所宣告
的物件以陣列索引的方式進行存取,藉此存取此陣列形式的
資料成員。

致理科大 商務科技管理系 彭建文 1


Chapter 15 委派與索引子 2

15-1 委派


派(delegate)的作用,類似於 C 和 C++中的函式指標,並且可以將函式
當成參數傳遞。可以把委派想成是房屋仲介公司,例如要買房子,並不需
要親自到處去找要出售的房屋,而是去房屋仲介公司詢問,他們會幫您找到合適
的房屋並處理細節;但是最後還要自己去簽定買賣契約等相關的事情。

委派就如同房屋仲介的腳色,房屋就如同是函式,將不同的函式指定給委派就如
同房屋仲介有很多不同的待賣房子;執行委派就如同找到了合適的房子;最後自
己去簽訂契約等細節,就如同函式的內容還是需要撰寫實際的程式碼。

使用委派的最大好處,就是可以簡化判斷敘述的複雜度;例如:有 10 個不同的
情形要執行 10 種不同的函式,透過委派則可以簡化這樣的判斷敘述。但是為了
要達到這樣的功能,如何設計委派則變得相對的重要。

範例 1:認識委派
建立㇐個委派函式,顯示字串:"Hello, 早安, 瑪莉"以及"Hello, 早安,
約翰"。

㇐、解說
要完成委派需要有 4 個步驟:1.建立需要被委派的函式、2. 建立委派、3.
宣告委派型別的變數、4. 將函式設定給委派變數。

建立被委派的函式
需要被委派的函式與㇐般的函式無異;例如:函式 HiMary()用於回傳 1 個
組合後的字串。HiMary()函式有 1 個字串參數 str;第 3 行則回傳"Hello,
早安, "與參數 str 組合後的字串。

1 public string HiMary(string str)


2 {
3 return "Hello, 早安, " + str + "\r\n";
4 }

致理科大 商務科技管理系 彭建文 2


Chapter 15 委派與索引子 3

建立委派
宣告委派的形式如下所示。最前面冠以關鍵字"delegate",接著是函式
宣告。

delegate 函式回傳型別 函式名稱([參數列]);

例如:要為函式 HiMary()建立委派;因為函式 HiMary()的函式回傳型別


為 string,以及帶有 1 個字串參數,因此委派的函式回傳值型別與參數列
也需與函式 HiMary()依樣,如下所示。

delegate string Dgate(string str);

宣告委派型別的變數
如下所示,建立 Dgate 型別的變數 Delfunc。

Dgate DelFunc;

將函式設定給委派變數
如下所示,將 HiMary()函式設定給委派變數 Delfunc。

DelFunc = HiMary;

二、執行結果
下圖左為原始畫面。按下「button1」按鈕後,輸出結果如下圖右所示。

致理科大 商務科技管理系 彭建文 3


Chapter 15 委派與索引子 4

三、表單設計
請在表單上放置如下表所列之控制項。

控制項 屬性 設定值
Button (Name) button1
Text button1
TextBox (Name) textbox1
Multiline True

四、撰寫程式碼
1. 建立委派函式。程式碼第 15 行,在全域變數區宣告 Dgate()委派,回
傳值型別為 string,並帶有㇐個字串參數。

2. 建立以 public 修飾的 HiMary()自訂函式;程式碼第 22 行宣告函式回


傳型別為 string 的 HiMary()自訂函式,並帶有㇐個字串參數。第 24
行回傳"Hello, 早安, "與參數 str 組合後的字串。

3. 建立以 public 修飾的 HiJohn()自訂函式;程式碼第 27 行宣告函式回


傳型別為 string 的 HiJohn()自訂函式,並帶有㇐個字串參數。第 29
行回傳"Hello, 午安, "與參數 str 組合後的字串。

致理科大 商務科技管理系 彭建文 4


Chapter 15 委派與索引子 5

4. 建立 button1 的 Click 事件,程式碼第 34 行宣告 Dgate 委派型別的


變數 DelFunc。第 36 行將自訂函式 HiMary()設定給委派變數 DelFunc;
因此呼叫 Delfunc()視同呼叫 HiMary()。第 37 行呼叫 DelFunc()委
派,傳入引數"瑪莉";並將結果顯示在 textBox1。第 39 行將自訂
函式 HiJohn()重新設定給委派變數 DelFunc;因此呼叫 Delfunc()視
同呼叫 HiJohn()。第 40 行呼叫 DelFunc()委派,傳入引數"約翰";
並將結果顯示在 textBox1。

完整程式列表

1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10
11 namespace WindowsFormsApp1
12 {
13 public partial class Form1 : Form
14 {
15 delegate string Dgate(string str);
16
17 public Form1()
18 {
19 InitializeComponent();
20 }
21
22 public string HiMary(string str)
23 {
24 return "Hello, 早安, " + str + "\r\n";

致理科大 商務科技管理系 彭建文 5


Chapter 15 委派與索引子 6

25 }
26
27 public string HiJohn(string str)
28 {
29 return "Hello, 午安, " + str + "\r\n";
30 }
31
32 private void Button1_Click(object sender, EventArgs e)
33 {
34 Dgate DelFunc;
35
36 DelFunc = HiMary;
37 textBox1.AppendText(DelFunc("瑪莉"));
38
39 DelFunc = HiJohn;
40 textBox1.AppendText(DelFunc("約翰"));
41 }
42 }
43 }

範例 2:委派-多點傳送
寫㇐程式,模擬文具用品與浴室用品特價商品剩餘的數量。例如,先顯示:"今
日特價商品:雙層鉛筆盒",接著再顯示:"今日特價商品:只剩下 25 個"。
其中,字串"今日特價商品:"、特價商品名稱、剩餘數量以多點重算之委派函
式處理。

㇐、解說
使用相同委派形式所宣告的委派變數,可以使用"+"、"-"運算子將委派
變數進行組合,此方式稱為多重傳送的委派(Multicast delegate)

例如,有 4 個委派型別的變數 del1-del3 與 allDel。其中 del1-del3 會


各自顯示字串"called from del1."、"called from del2."與"
called from del3.";首先,如下程式碼敘述:

allDel = del1+del2;

當呼叫 allDel 時,會先去執行 del1 所委派的函式,再去執行 del2 所委


派的函式,因此會顯示:

致理科大 商務科技管理系 彭建文 6


Chapter 15 委派與索引子 7

called from del1.


called from del2.

所以對於委派而言,運算子"+"更像是定義函式執行的先後執行關係,並
依照順序執行。接著,再接續如下 2 個敘述:

1. allDel -= del2;
2. allDel += del3;

上述程式敘述,程式碼第 1 行的運算子"-"會移去 allDel 中的 del2,而


第 2 行再加入 del3 委派;因此,allDel 相當於 del1 加上 del3,所以當
執行 allDel 委派時,則會輸出:

called from del1.


called from del3.

二、執行結果
下圖左為原始畫面。點選「文具用品」後按下「Go」按鈕後,輸出結果如下
圖中所示。點選「浴室用品」後按下「Go」按鈕後,輸出結果如下圖右所示。

三、表單設計
請在表單上放置如下表所列之控制項。

控制項 屬性 設定值
RadioButton (Name) radioButton1

致理科大 商務科技管理系 彭建文 7


Chapter 15 委派與索引子 8

控制項 屬性 設定值
Text 文具用品
Checked True
RadioButton (Name) radioButton2
Text 浴室用品
Button (Name) button1
Text Go
TextBox (Name) textBox1
Multiline True

四、撰寫程式碼
1. 建立委派函式。程式碼第 15 行,在全域變數區宣告 Dgate()委派,回
傳值型別為 void。

2. 建立以 public 修飾的 PreWords()自訂函式;程式碼第 22 行宣告函式


回傳型別為 void 的 PreWords()自訂函式,第 24 行在 textBox1 上顯
示"今日特價商品:"。

3. 建立以 public 修飾的 Item()自訂函式,用於依據使用者的選擇,顯示


相對應的特價商品。程式碼第 27 行宣告函式回傳型別為 void 的 Item()
自訂函式,第 29-32 行判斷若 radioButton1 被勾選,則在 textBox1
上顯示"雙層鉛筆盒\r\n",否則顯示"精美手工皂\r\n"。

致理科大 商務科技管理系 彭建文 8


Chapter 15 委派與索引子 9

4. 建立以 public 修飾的 Sold()自訂函式,以亂數模擬特價商品剩餘的數


量。程式碼第 35 行宣告函式回傳型別為 void 的 Sold()自訂函式,第
37 行宣告並初始化 Ramdon 型別的變數 rd,第 38 行宣告整數變數 num,
用於表示特價商品剩餘的數量。第 40 行產生 30 以內的亂數,並儲存於
變數 num,第 41 行將剩餘數量顯示於 textBox1。

5. 建立 button1 的 Click 事件。程式碼第 46-49 行分別建立 Dgate 型別


的 4 個變數:DelFunc1-DelFunc3 與 AllDel;DelFunc1-DelFunc3 分
別指向 PreWords()、Item()與 Sold()此 3 個自訂函式。

致理科大 商務科技管理系 彭建文 9


Chapter 15 委派與索引子 10

第 51 行將 DelFunc1 與 DelFunc2 組合後並設定給 AllDel;因此,當


執行 AllDel 時,會先執行 DelFunc1 所指向的自訂函式 PreWord(),
接著再執行 DelFunc2 所指向的自訂函式 Item()。第 52 行執行 AllDel()
委派函式。

第 54 行先從 DelAll 中移去 DelFun2,然後第 55 行再把 DelFunc3 組


合到 DelAll;因此,DelAll 等於 DelFunc1 與 DelFunc3 的組合。第
56 行執行 AllDel()委派函式。

完整程式列表

1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10
11 namespace WindowsFormsApp1
12 {
13 public partial class Form1 : Form
14 {
15 delegate void Dgate();
16
17 public Form1()
18 {
19 InitializeComponent();
20 }
21
22 public void PreWords()
23 {
24 textBox1.AppendText("今日特價商品:");
25 }
26
27 public void Item()
28 {
29 if (radioButton1.Checked)
30 textBox1.AppendText("雙層鉛筆盒\r\n");
31 else
32 textBox1.AppendText("精美手工皂\r\n");
33 }
34
35 public void Sold()

致理科大 商務科技管理系 彭建文 10


Chapter 15 委派與索引子 11

36 {
37 Random rd = new Random();
38 int num;
39
40 num = rd.Next(1, 30);
41 textBox1.AppendText("只剩下 " + num + " 個\r\n");
42 }
43
44 private void Button1_Click(object sender, EventArgs e)
45 {
46 Dgate DelFunc1= PreWords;
47 Dgate DelFunc2=Item;
48 Dgate DelFunc3 = Sold;
49 Dgate AllDel;
50
51 AllDel = DelFunc1 + DelFunc2;
52 AllDel();
53
54 AllDel -= DelFunc2;
55 AllDel += DelFunc3;
56 AllDel();
57 }
58 }
59 }

15-2 索引子


引子(indexer)主要使用於當類別中的資料成員(例如:屬性)是集合
或是陣列形式時,利用索引子的特性,可以把類別所宣告的㇐個物件以陣
列索引的方式進行存取;當以陣列索引的方式存取物件時,即視為存取這些資料
成員。此外,結構、介面也能使用索引子。

範例 3:認識索引子
有㇐類別 MyClass,其有㇐個陣列形式的整數屬性 number,使用索引子的方式,
設定與讀取此屬性。

㇐、解說
在類別裡,索引子的宣告以 public 修飾字開始,並使用 this 識別字作為
存取資料成員的替身。回傳資料型別則與要透過索引子操作的資料成員的資
料型別相同。在 this 之後接著是如同陣列索引㇐般的[]中括弧;如下所示。

致理科大 商務科技管理系 彭建文 11


Chapter 15 委派與索引子 12

1 class 類別名稱
2 { 索引子
3
4 public 回傳資料型別 this[資料型別 索引變數]
5 {
6
7 }
8 }

以本範例的類別 MyClass 為例,如下所示。程式碼第 3 行宣告了㇐個陣列


形式的整數屬性 number。第 5-9 行為針對 number 所撰寫的索引子,因為
number 是整數型別;因此,索引子的回傳資料型別也是整數。而在[]中的
資料型別,是索引變數本身的資料型別;換句話說,索引變數不㇐定是㇐個
數值,也可以是其他的資料型別;例如:字串資料。第 7-8 行則是索引子的
內容。此範例的索引子內容為使用 get/set 存取子對 number 進行設定與
存取;索引子內 get/set 存取子,只要符合索引子的規範,可以視自己的
需求撰寫程式碼;但都是須對 number 做設定與讀取。

1 class MyClass
2 {
3 int[] number=new int[10];
4
5 public int this[int index]
6 {
7 get { return number[index]; }
8 set { number[index] = value; }
9 }
10 }

接著,在程式中宣告與使用 MyClass 的物件,如下所示。程式碼第 2 行宣


告並初始化 Myclass 的物件 myclass。雖然 myclass 宣告時並不是陣列,
但是在第 4 行程式碼卻以陣列的形式將 myclass[3]設定為數值 12。

1
2 MyClas myclass = new MyClass();

致理科大 商務科技管理系 彭建文 12


Chapter 15 委派與索引子 13

3
4 myclass[3] = 12;
5

其實,第 4 行程式碼會執行 myclass 的索引子,將 number[3]設定為數值


12;因此,第 4 行程式碼視同:

number[3] = 12;

二、執行結果
下圖左為原始畫面。程式㇐開始執行時會先對 Myclass 的物件 myclass 初
始化,並產生 10 個亂數。按下「myclass」按鈕後,透過 myclass 的索引
子顯示此 10 個亂數,如下圖中所示。若按下「number」按鈕後,則直接讀
取 myclass 中的 number 屬性,如下圖右所示,並且發現透過索引子讀取
的資料與直接讀取 number 的資料,其實是相同的。

三、表單設計
請在表單上放置如下表所列之控制項。

控制項 屬性 設定值
Button (Name) button1
Text myclass
Button (Name) button2
Text number
TextBox (Name) textBox1
Multiline Treu

致理科大 商務科技管理系 彭建文 13


Chapter 15 委派與索引子 14

四、撰寫程式碼
1. 建立 MyClass 類別。程式碼第 46-62 行建立 MyClass 類別,第 48 行
宣告 public 修飾字修飾的整數陣列屬性 number。number 並不需要以
public 修飾字修飾;使用 public 修飾 number 只是為了方便能直接
讀取 number 的值,並與透過索引子讀取的值作比較而已。

第 50-55 行為 MyClass 的建構子,有 1 個整數參數 num,用於指定要


配置給陣列 number 的空間。第 52-53 行若參數 num 小於 0,則將 num
設定為 10。第 54 行初始化與配置陣列空間給 number。

第 57-62 行為索引子,以 public 修飾字修飾,所以可以供類別外部呼


叫。索引子回傳型別為整數,並有 1 個索引值 i。第 59-60 行為 number
的 get/set 存取子,用於讀取與設定 number 的第 i 個元素。

2. 建立全域變數。程式碼第 15-16 行建立 2 個全域變數:MyClass 類別的

致理科大 商務科技管理系 彭建文 14


Chapter 15 委派與索引子 15

物件 myclass 與 Random 型別的變數 rd,並初始化 rd。

3. 在表單的建構子中,程式碼第 22-26 行建立與初始化 myclass,並給予


初始值。

第 22 行將 myclass 初始化,並指定 myclass 的屬性 number 的陣列空


間大小為 10。第 24-25 行使用 100 以內的亂數,使用索引子的方式設
定給 myclass 的屬性 number。

4. 建立 button1 的 Click 事件。程式碼第 31-34 行透過索引子讀取


number 的值,並顯示於 textBox1。

5. 建立 button2 的 Click 事件。程式碼第 39-42 行直接讀取 myclass 物


件的 number 屬性,並將其值逐㇐顯示於 textBox1。

致理科大 商務科技管理系 彭建文 15


Chapter 15 委派與索引子 16

分析與討論

索引子可以把類別宣告的㇐個物件,當成陣列索引般地使用,其實是為了要簡化
類別中的集合或是陣列成員的存取方式;但也容易造成程式碼不易了解與識別。
然而,使用傳統的方式㇐樣很方便:將此物件直接宣告為物件陣列、直接使用集
合或陣列成員原本的存取方式。

使用傳統的方式還有㇐些好處,例如:當需要把此 C#程式轉換為 C/C++、Java


等語言時,就顯得容易多了;除非不需要考量這樣的情形。因此,是否要使用索
引子就視各自的偏好與需求了。

完整程式列表

1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10
11 namespace WindowsFormsApp1
12 {
13 public partial class Form1 : Form
14 {
15 MyClass myclass;
16 Random rd = new Random();
17
18 public Form1()
19 {
20 InitializeComponent();
21
22 myclass = new MyClass(10);
23
24 //透過索引子設定number屬性
25 for (int i = 0; i < 10; i++)

致理科大 商務科技管理系 彭建文 16


Chapter 15 委派與索引子 17

26 myclass[i] = rd.Next(100);
27 }
28
29 private void Button1_Click(object sender, EventArgs e)
30 {
31 //透過索引子讀取number屬性
32 for (int i = 0; i < 10; i++)
33 textBox1.AppendText(myclass[i].ToString() +
34 "\r\n");
35 }
36
37 private void Button2_Click(object sender, EventArgs e)
38 {
39 //直接讀取number屬性
40 for (int i = 0; i < 10; i++)
41 textBox1.AppendText(myclass.number[i].ToString() +
42 "\r\n");
43 }
44 }
45
46 class MyClass
47 {
48 public int[] number; //陣列形式的屬性
49
50 public MyClass(int num)
51 {
52 if (num <= 0)
53 num = 10;
54 number = new int[num];
55 }
56
57 public int this[int i] ///屬性number的索引子
58 {
59 get => number[i];
60 set => number[i] = value;
61 }
62 }
63 }

範例 4:多個索引子
有㇐類別 MyClass,其有 2 個陣列屬性:score 與 name;score 用於儲存分數,
而 name 用於儲存姓名。寫㇐程式使用索引子取得姓名與分數:首先輸入陣列的
索引值取得姓名,再由姓名當成索引,取出分數。

㇐、解說
類別裡對於㇐個集合或是陣列形式的資料成員,可以有多個索引子:2 個索
引子的回傳型別與索引值的資料型別都不㇐樣,即可視為視不同的索引子。

致理科大 商務科技管理系 彭建文 17


Chapter 15 委派與索引子 18

例如在某個類別裡有 2 個陣列屬性:

1
2 int []score = new int[5];
3 string []name = new string[5];
4

並有 2 個索引子如下所示:程式碼第 1-5 行為第 1 個索引子,第 6-13 行為


第 2 個索引子。

1 public int this[int index]


2 {
3 get => score[i];
4 set => score[i] = value;
5 }
6 public string this[string str]
7 {
8 for(int i=0;i<name.Length;i++)
9 {
10 if (str.Equals(name[i]))
11
12 }
13 }

因為 2 個索引子的回傳值型別與索引值的資料型別都不同,所以被視為 2 個
不同的索引子。第㇐個索引子對屬性 score 存取,第 2 個索引子則對屬性
name 存取。

二、執行結果
下圖左為原始畫面。輸入陣列的索引編號後,按下「查詢」按鈕,可以透過
索引編號查詢人名,再由人名查詢分數;如下圖右所示。

致理科大 商務科技管理系 彭建文 18


Chapter 15 委派與索引子 19

三、表單設計
請在表單上放置如下表所列之控制項。

控制項 屬性 設定值
Label (Name) label1
Text 編號:
Button (Name) button1
Text 查詢
TextBox1 (Name) textBox1
Text 1
TextBox2 (Name) textBox2
Multiline True

四、撰寫程式碼
1. 建立類別 MyClass。程式碼第 46-94 行為別 MyClass,第 48-49 行宣
告 2 個陣列屬性,分別是整數陣列 score,用於儲存分數,以及字串陣
列 name,用於儲存姓名。第 51-57 行為類別 MyClass 的建構子,並帶
有㇐個參數 num,此參數用於設定 score 與 name 的陣列大小。第 53-
54 判斷若 num 小於等於 0,則將 num 設定為 5。第 55-56 行初始化並
配置陣列空間給 score 與 name。

致理科大 商務科技管理系 彭建文 19


Chapter 15 委派與索引子 20

第 60-66 行建立自訂方法 Add(),並使用 public 修飾字修飾;因此,


Add()於類別之外也能被呼叫;並且帶有 3 個參數:整數 i、字串 str
與整數 s。參數 i 用於判斷存取範圍是否超過了陣列大小,字串 str 與
整數 s 則為欲被儲存的姓名資料與分數資料。第 62-63 行判斷存取範
圍若超過陣列大小,則返回。第 64-65 行將資料儲存於 score 與 name。

第 69-78 為類別 MyClass 的第 1 個索引子,用於回傳姓名。第 69 行


宣告了回傳型別為字串的索引子。第 71-77 行為 get 存取子,第 73-
76 行判斷若讀取陣列的索引值超出陣列範圍,則回傳空字串;否則將
姓名回傳給呼叫者。

致理科大 商務科技管理系 彭建文 20


Chapter 15 委派與索引子 21

第 81-93 行為類別 MyClass 的第 2 個索引子,用於回傳分數。第 69 行


宣告了回傳型別為整數的索引子,並且只有㇐個 get 存取子。

第 83-92 行為 get 存取子,第 85-89 行搜尋陣列 name 裡面的每㇐個


元素,並使用 Equals()方法與參數 str 做比較;若 2 個姓名字串的內
容相同,則將相對應的分數回傳給呼叫者。第 91 行若找不到相同的姓
名則回傳-1,表示找不到此姓名的分數。

完整程式列表

1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;

致理科大 商務科技管理系 彭建文 21


Chapter 15 委派與索引子 22

5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10
11 namespace WindowsFormsApp1
12 {
13 public partial class Form1 : Form
14 {
15 public Form1()
16 {
17 InitializeComponent();
18 }
19
20 private void Button1_Click(object sender, EventArgs e)
21 {
22 int num = 5;
23 int index;
24 string str;
25 MyClass myclass = new MyClass(num);
26 int []score={80, 92, 67, 84, 60};
27 string[] name = { "王小明", "真美麗", "王老五",
28 "瑪莉", "約翰" };
29
30 for(int i=0;i<num; i++)
31 myclass.Add(i, name[i], score[i]);
32
33 index = Convert.ToInt32(textBox1.Text)-1;
34 if(index<0 || index>=num)
35 {
36 MessageBox.Show("無此編號");
37 return;
38 }
39
40 str=myclass[index];
41 textBox2.AppendText(str + "的分數=");
42 textBox2.AppendText(myclass[str].ToString() + "\r\n");
43 }
44 }
45
46 class MyClass
47 {
48 int[] score; //分數
49 string[] name; //姓名
50
51 public MyClass(int num)
52 {
53 if (num <= 0)
54 num = 5;
55 score = new int[num];
56 name = new string[num];
57 }
58
59 // 增加㇐筆資料:姓名、分數

致理科大 商務科技管理系 彭建文 22


Chapter 15 委派與索引子 23

60 public void Add(int i, string str, int s)


61 {
62 if (i < 0 || i > score.Length - 1)
63 return;
64 name[i] = str;
65 score[i] = s;
66 }
67
68 //索引子:使用陣列索引值查詢姓名
69 public string this[int i]
70 {
71 get
72 {
73 if (i < 0 || i > name.Length - 1)
74 return "";
75 else
76 return name[i];
77 }
78 }
79
80 //索引子:使用姓名查詢分數
81 public int this[string str]
82 {
83 get
84 {
85 for(int i=0;i<name.Length;i++)
86 {
87 if (str.Equals(name[i]))
88 return score[i];
89 }
90
91 return -1;
92 }
93 }
94 }
95 }

致理科大 商務科技管理系 彭建文 23


Chapter 15 委派與索引子 24

致理科大 商務科技管理系 彭建文 24

You might also like