索引器(indexer)允許一個對象可以像數組一樣被索引,當爲類定義一個索引器時,該類的行爲就會像一個虛擬數組一樣,可以使用數組訪問運算符[ ]來訪問該類的實例,索引器是一組get和set訪問器,與屬性類似。
索引器與屬性的異同
(1)和屬性一樣,索引器不用分配內存來存儲
(2)索引器和屬性都主要被用來訪問其他數據成員,它們與這些成員關聯,併爲它們提供獲取和設置訪問,只是屬性通常表示單獨的數據成員,索引器通常表示多個數據成員,索引器本身可以是任何類型,不僅僅是數值類型。
(3)和屬性一樣,索引器可以只有一個訪問器,也可以倆個都有
(4)索引器總是實例成員,因此不能聲明爲static
(5)和屬性一樣,實現get和set訪問器的代碼不必一定要關聯到某個字段或屬性,這段代碼可以做任何事情或什麼也不做,只要get訪問器返回某個指定類型的值即可
(6)和屬性一樣,不能顯式調用get和set訪問器,並且在set訪問器中包含隱式參數value
聲明索引器
(1)索引器沒有名稱,在名稱的位置是關鍵字this
(2)參數列表在方括號中
(3)參數列表中必須至少聲明一個參數
(4)聲明爲public,以便從類的外部訪問
索引器重載
類中的索引器如果想構成重載,則必須有不同的參數列表,僅是索引器類型不同是構不成重載的,這點類似於C++中的函數重載
class A
{
public string s1;
public string s2;
public int i1;
public int i2;
public string this[int index]
{
set
{
switch(index)
{
case 0:s1 = value;
break;
case 1:s2 = value;
break;
default:
throw new ArgumentOutOfRangeException("index");
}
}
get
{
switch(index)
{
case 0:return s1;
case 1:return s2;
default:
throw new ArgumentOutOfRangeException("index");
}
}
}
public int this[string index2] //如果寫成public int this[int index1]則會出錯,這構不成重載,會造成二義性
{
set
{
switch(index2)
{
case "i1": i1 = value;
break;
case "i2":i2 = value;
break;
default:
throw new ArgumentOutOfRangeException("index2");
}
}
get
{
switch(index2)
{
case "i1":return i1;
case "i2":return i2;
default:
throw new ArgumentOutOfRangeException("index2");
}
}
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
a[0] = "sss";
a[1] = "ssss";
Console.WriteLine(a.s1); //sss
Console.WriteLine(a.s2); //ssss
a["i1"] = 100;
a["i2"] = 200;
Console.WriteLine(a.i1); //100
Console.WriteLine(a.i2); //200
}
}