C#中为类添加索引器

    技术2022-05-20  49

    昨天有朋友问我C#中索引器怎么用的,给他解释了一番。问问其他的人,也回答不会用。显然的,因为觉得索引器不常用,都把它淡忘了,其实索引器我们经常在使用:访问数组、集合元素时:array[i],访问DataGridView、GridView时:gridView.DataKeys[index][“cellName”],ADO.NET中:DataReader[“columnName”]。等等,用的还是比较多的,因此很有必要了解下这东东。

    1. 什么是索引器

    索引器允许类和结构的实例用下标进行访问,这种方式类似于访问数组、集合的元素,但不单单是通过下标,例如通过对象的各属性值也是可以的。索引器写在类或者结构中,其格式类似于:

    ? public object this [ int index] {     get { return objects[ int ]; }     set { objects[ int ] = value; } }

    索引器是特殊的属性,可以有get、set访问器,可以重载。object是返回的对象类型,this代表类或结构自己,int index表示索引类型。这与索引器的调用格式:对象[索引],相对应。下面我们通过例子来实践下:我们写个汽车类,为它添加索引器。

    2. 为类添加索引器

    首先创建Car类:

    ? /// <summary> /// 汽车 /// </summary> public class Car {     /// <summary>     /// 品牌     /// </summary>     public string Brand { get ; set ; }     /// <summary>     /// 颜色     /// </summary>     public string Color { get ; set ; }     /// <summary>     /// 覆盖object的ToString()方法     /// </summary>     /// <returns></returns>     public override string ToString()     {         return string .Format( "A {0} {1}." , this .Color, this .Brand);     } }

    为汽车添加了品牌(Brand)与颜色(Color)属性,并覆盖了ToString()方法,用于显示汽车的信息。接着我们创建Cars类,在里面添加索引器访问Car:

    ? /// <summary> /// 汽车集合 /// </summary> public class Cars {     public IList<Car> List { get ; set ; }     /// <summary>     /// 用下标访问的索引器     /// </summary>     /// <param name="index">下标</param>     /// <returns>汽车</returns>     public Car this [ int index]     {         get { return this .List[index]; }     }     /// <summary>     /// 用品牌访问的索引器     /// </summary>     /// <param name="brand">品牌</param>     /// <returns>汽车</returns>     public Car this [ string brand]     {         get         {             for ( int i = 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))                     return this .List[i];             return null ;         }     } }

    Cars有个Car集合,写了两个索引器,分别用下标和汽车品牌进行访问,构成了重载,这里若不写下标索引器是不能用cars[index]访问Car的。下面我们编写入口,测试索引器是否起作用了,实例化3辆车:黑色宝马、红色奔驰、黄色保时捷。

    ? public class Program {     public static void Main( string [] args)     {         Cars cars = new Cars         {             List = new List<Car>             {                 new Car { Brand = "BMW" , Color = "Black" },     // 黑色宝马                 new Car { Brand = "Benz" , Color = "Red" },      // 红色奔驰                 new Car { 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

     


    最新回复(0)