索引器允許類或者結構的實例就像數組一樣進行索引,當您為一個類定義一個索引器時,這個類就會像一個數組一樣,您可以使用數組訪問符 '[]' 對該類的實例進行訪問.. 索引器與 屬性 類似,但是索引器要采用參數,(也可以這麼認為,索引器是一個類的屬性,同樣也是通過訪問器(一種特殊的方法) 實現的)
為了更清楚一點,還是舉個例子吧, 大學是人生中最悠閒的時光,同學們可以做許多自己曾經想做而因為種種原因沒有做的事,逃課很明顯正是其中之一..為了制止逃課的行為,每次上課的時候老師都要點名或者是點學號,我是4班的,老師喜歡點學號,4班1號 然後下面大聲答到……,“4班2號”,“到”,“4班3號”...... 3號。。3號同學。。,“老師HC666今天肚子疼上醫院了”(中國好室友阿^_^),“哦,4號”..... 老師點名就是對4班的一個索引。
如果將class4看作是由Classes類實例化的一個對象,class[1]就是對1號同學的索引,(想一想數組就明白了)那怎麼實現呢?
上面也說了,索引器與屬性類似,自然也少不了get,set訪問器了,索引器也是類的成員,自然也得在類裡面定義了,如下:
public 返回值類型 this[參數類型 參數]
{
get { return 參數指定的值; } //get訪問器
set { /*設置參數指定的值 */ } //set訪問器
}
我們將上面的例子代碼化,如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 {//定義一個能被索引的類 class Classes {//對類的索引實質是對類中數組的索引 public string[] StudentName=new string[6]; //定義索引器 public string this[int ID] { get { return StudentName[ID]; } set { StudentName[ID] = value; } //set訪問器自帶value參數 } } class Program { static void Main(string[] args) { Classes class4 = new Classes(); //索引寫入 for (int i = 1; i < 6; i++) { class4[i] = HC+i; } //索引讀出 for (int j = 1; j < 6; j++) { Console.WriteLine(j+號 +class4[j]); } } } }
結果:
上面的程序中,我們實現了通過學號索引出該學生姓名,那怎麼實現通過姓名索引出學號呢?我們將索引看作是一個特殊的方法,方法可以利用重載實現不同的參數相同的功能,那麼索引器自然也可以重載。用法與方法重載類似,(查看方法重載點這裡),我們還是接著上面的例子,這次要滿足使用姓名索引出學號:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 {//定義一個能被索引的類 class Classes {//對類的索引實質是對類中數組的索引 public string[] StudentName=new string[6]; //定義索引器 public string this[int ID] { get { return StudentName[ID]; } set { StudentName[ID] = value; } //set訪問器自帶value參數 } //重載索引器參數設為string類型 public uint this[string name] { get { //找到與name匹配的學號 uint index=1; while (StudentName[index] != name && index < 6) { index++; } return index; } set { } } } class Program { static void Main(string[] args) { Classes class4 = new Classes(); //索引寫入 for (int i = 1; i < 6; i++) { class4[i] = HC+i; } //索引讀出,通過學號索引出姓名 for (int j = 1; j < 6; j++) { Console.WriteLine(j+號 +class4[j]); } //通過姓名索引出學號 for (int k = 1; k < 6; k++) { string name=HC+k; Console.WriteLine(name+ +class4[name]+號);//對比上面用法一樣參數不一樣 } } } }
結果:
在上面中我們說了當一個類定義了索引器就可以將這個類當作數組一樣看待,那在學習 數組 的時候知道,數組有多維度的,索引器所在的類呢??我們遍歷數組用的foreach遍歷語句對這個類也能用嗎??我下一篇再作介紹吧!!(因為學校要短電了……)希望您繼續支持HC666^_^
您的建議與評論是我完善自我的動力,感謝您的閱讀,有錯誤的地方歡迎指出來或私信我^_^