本筆記摘抄自:https://www.cnblogs.com/ArmyShen/archive/2012/08/27/2659405.html,記錄一下學習過程以備後續查用。html
索引器容許類或者結構的實例按照與數組相同的方式進行索引取值,索引器與屬性相似,不一樣的是索引器的訪問是帶參的。數組
索引器和數組比較:函數
1)索引器的索引值(Index)類型不受限制學習
2)索引器容許重載this
3)索引器不是一個變量url
索引器和屬性的不一樣點:spa
1)屬性以名稱來標識,索引器以函數形式標識。.net
2)索引器能夠被重載,屬性不能夠。code
3)索引器不能聲明爲static,屬性能夠。htm
1、下面代碼演示一個簡單的索引器:
class Program { /// <summary> /// 簡單的索引器類 /// </summary> public class SimpleIndexerClass { private readonly string[] name = new string[2]; /// <summary> /// 索引器必須以this關鍵字定義,其實這個this就是類實例化以後的對象。 /// </summary> /// <param name="index"></param> /// <returns></returns> public string this[int index] { get //實現索引器的get方法 { if (index < 2) { return name[index]; } return null; } set //實現索引器的set方法 { if (index < 2) { name[index] = value; } } } } static void Main(string[] args) { #region 簡單的索引器 //索引器的使用 SimpleIndexerClass indexer = new SimpleIndexerClass(); //「=」號右邊對索引器賦值,其實就是調用其set方法。 indexer[0] = "張三"; indexer[1] = "李四"; //輸出索引器的值,其實就是調用其get方法。 Console.WriteLine(indexer[0]); Console.WriteLine(indexer[1]); Console.Read(); #endregion } }
運行結果以下:
2、下面代碼演示以字符串做爲下標,對索引器進行存取。
class Program { /// <summary> /// 以字符串做爲下標,對索引器進行存取。 /// </summary> public class StringIndexerClass { //用string做爲索引器下標的時候,要用Hashtable。 private Hashtable name = new Hashtable(); /// <summary> /// 索引器必須以this關鍵字定義,其實這個this就是類實例化以後的對象。 /// </summary> /// <param name="index"></param> /// <returns></returns> public string this[string index] { get { return name[index].ToString(); } set { name.Add(index, value); } } } static void Main(string[] args) { #region 以字符串做爲下標,對索引器進行存取。 StringIndexerClass Indexer = new StringIndexerClass(); Indexer["A0001"] = "張三"; Indexer["A0002"] = "李四"; Console.WriteLine(Indexer["A0001"]); Console.WriteLine(Indexer["A0002"]); Console.Read(); #endregion } }
運行結果以下:
3、下面代碼演示索引器的重載。
class Program { /// <summary> /// 索引器的重載 /// </summary> public class OverloadIndexerClass { private Hashtable name = new Hashtable(); //第一種索引器:經過key存取Values public string this[int index] { get { return name[index].ToString(); } set { name.Add(index, value); } } //第二種索引器:經過Values存取key public int this[string addName] { get { //Hashtable中實際存放的是DictionaryEntry(字典)類型 //若是要遍歷一個Hashtable,就須要使用到DictionaryEntry。 foreach (DictionaryEntry dict in name) { if (dict.Value.ToString() == addName) { return Convert.ToInt32(dict.Key); } } return -1; } set { name.Add(value, addName); } } } static void Main(string[] args) { #region 索引器的重載 OverloadIndexerClass Indexer = new OverloadIndexerClass(); //第一種索引器的使用 Indexer[1] = "張三"; //set訪問器的使用 Indexer[2] = "李四"; Console.WriteLine("編號爲1的名字:" + Indexer[1]); //get訪問器的使用 Console.WriteLine("編號爲2的名字:" + Indexer[2]); Console.WriteLine(); //第二種索引器的使用 Console.WriteLine("張三的編號是:" + Indexer["張三"]); //get訪問器的使用 Console.WriteLine("李四的編號是:" + Indexer["李四"]); Indexer["王五"] = 3; //set訪問器的使用 Console.WriteLine("王五的編號是:" + Indexer["王五"]); Console.Read(); #endregion } }
運行結果以下:
4、多參索引器
class Program { /// <summary> /// 入職信息類 /// </summary> public class EntrantInfo { //工號 public int JobNumber { get; set; } //姓名 public string Name { get; set; } //部門 public string Department { get; set; } /// <summary> /// 無參構造函數 /// </summary> public EntrantInfo() { } /// <summary> /// 有參構造函數 /// </summary> /// <param name="jobNumber">工號</param> /// <param name="name">姓名</param> /// <param name="department">部門</param> public EntrantInfo(int jobNumber, string name, string department) { JobNumber = jobNumber; Name = name; Department = department; } } //聲明一個類EntrantInfo的索引器 public class EntrantInfoIndexerClass { private readonly ArrayList arrayList; //用於存放EntrantInfo類 public EntrantInfoIndexerClass() { arrayList = new ArrayList(); } //聲明一個索引器:以姓名及部門查找工號。 public int this[string name, string department] { get { foreach (EntrantInfo ei in arrayList) { if (ei.Name == name && ei.Department == department) { return ei.JobNumber; } } return -1; } set { //new關鍵字:C#規定,實例化一個類或者調用類的構造函數時,必須使用new關鍵。 arrayList.Add(new EntrantInfo(value, name, department)); } } //聲明一個索引器:以工號查找姓名和部門。 public ArrayList this[int jobNumber] { get { ArrayList alFind = new ArrayList(); foreach (EntrantInfo ei in arrayList) { if (ei.JobNumber == jobNumber) { alFind.Add(ei); } } return alFind; } } //還能夠聲明多個版本的索引器... } static void Main(string[] args) { #region 多參索引器 EntrantInfoIndexerClass indexer = new EntrantInfoIndexerClass(); //this[string name, string department]的使用 indexer["張三", "行政人事部"] = 101; indexer["李四", "行政人事部"] = 102; Console.WriteLine("行政人事部張三的工號:" + indexer["張三", "行政人事部"]); Console.WriteLine("行政人事部李四的工號:" + indexer["李四", "行政人事部"]); Console.WriteLine(); //this[int jobNumber]的使用 foreach (EntrantInfo ei in indexer[101]) { Console.WriteLine("工號101的姓名:" + ei.Name); Console.WriteLine("工號101的部門:" + ei.Department); } Console.Read(); #endregion } }
運行結果以下: