本筆記摘抄自:https://www.cnblogs.com/ArmyShen/archive/2012/08/27/2659405.html,記錄一下學習過程以備後續查用。
索引器允許類或者結構的執行個體按照與數組相同的方式進行索引取值,索引器與屬性類似,不同的是索引器的通路是帶參的。
索引器和數組比較:
1)索引器的索引值(Index)類型不受限制
2)索引器允許重載
3)索引器不是一個變量
索引器和屬性的不同點:
1)屬性以名稱來辨別,索引器以函數形式辨別。
2)索引器可以被重載,屬性不可以。
3)索引器不能聲明為static,屬性可以。
一、下面代碼示範一個簡單的索引器:
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
}
}
運作結果如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuUjMzQjM1ADMwETLygzNzQDMxQTMwMjMxkTMwITLzIjN3IjMx8CXyETOxAjMvw1MyYzNyITMvwVY0VmYtk2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
二、下面代碼示範以字元串作為下标,對索引器進行存取。
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
}
}
三、下面代碼示範索引器的重載。
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
}
}
四、多參索引器
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
}
}