昨天有朋友問我C#中索引器怎麼用的,給他解釋了一番。問問其他的人,也回答不會用。顯然的,因為覺得索引器不常用,都把它淡忘了,其實索引器我們經常在使用:訪問數組、集合元素時:array[i],訪問DataGridView、GridView時:gridView.DataKeys[index][“cellName”],ADO.NET中:DataReader[“columnName”]。等等,用的還是比較多的,因此很有必要瞭解下這東東。
1. 什麼是索引器
索引器允許類和結構的執行個體用下標進行訪問,這種方式類似於訪問數組、集合的元素,但不單單是通過下標,例如通過對象的各屬性值也是可以的。索引器寫在類或者結構中,其格式類似於:
?
public object this[intindex]{ get{returnobjects[int]; } set{ objects[int] = value; }} |
索引器是特殊的屬性,可以有get、set訪問器,可以重載。object是返回的物件類型,this代表類或結構自己,int index表示索引類型。這與索引器的調用格式:對象[索引],相對應。下面我們通過例子來實踐下:我們寫個汽車類,為它添加索引器。
2. 為類添加索引器
首先建立Car類:
?
/// <summary>/// 汽車/// </summary>public class Car{ /// <summary> /// 品牌 /// </summary> publicstringBrand {get;set; } /// <summary> /// 顏色 /// </summary> publicstringColor {get;set; } /// <summary> /// 覆蓋object的ToString()方法 /// </summary> /// <returns></returns> publicoverridestringToString() {
return string.Format("A {0} {1}.",this.Color,this.Brand); }} |
為汽車添加了品牌(Brand)與顏色(Color)屬性,並覆蓋了ToString()方法,用於顯示汽車的資訊。接著我們建立Cars類,在裡面添加索引器訪問Car:
?
/// <summary>/// 汽車集合/// </summary>public class Cars{ publicIList<Car> List {get;set; } /// <summary> /// 用下標訪問的索引器 /// </summary> /// <param name="index">下標</param> /// <returns>汽車</returns> publicCarthis[intindex] {
get { returnthis.List[index]; } } /// <summary> /// 用品牌訪問的索引器 /// </summary> /// <param name="brand">品牌</param> /// <returns>汽車</returns> publicCarthis[stringbrand] {
get
{
for (inti = 0; i < List.Count; i++) // 為false的情況較多,所以這裡用Equals比較, // 而不用==,具體為什麼,請看我的前一篇隨筆 // 《C# 中“Equals”與“==”的速度比較》 //http://www.cnblogs.com/ju2ender/archive/2010/03/21/1691033.html if(brand.Equals(this.List[i].Brand)) returnthis.List[i];
return null;
} }} |
Cars有個Car集合,寫了兩個索引器,分別用下標和汽車品牌進行訪問,構成了重載,這裡若不寫下標索引器是不能用cars[index]訪問Car的。下面我們編寫入口,測試索引器是否起作用了,執行個體化3輛車:黑色寶馬、紅色平治、黃色保時捷。
?
public class Program{ publicstaticvoidMain(string[] args) {
Cars cars = newCars
{
List = new List<Car>
{ newCar { Brand ="BMW", Color ="Black"}, // 黑色寶馬 newCar { Brand ="Benz", Color ="Red"}, // 紅色平治 newCar { Brand ="Porsche", Color ="Yellow"}// 黃色保時捷
}
};
Console.Title = "索引器";
Console.WriteLine(cars[0].ToString());
Console.WriteLine(cars["Porsche"].ToString());
Console.ReadLine(); }} |
分別用下標和品牌進行了訪問,下面是運行結果:
樣本項目名為OOP,點這裡下載。
轉自:http://www.cnblogs.com/ju2ender/archive/2010/03/27/1698528.html