基础概念
索引器,将一个对象变的可以像数组一样使用下标访问,索引器的创建类似属性,都需要设置Get和Set方法。
创建格式:
type this[int index]
{// get 访问器get{// 返回 index 指定的值}// set 访问器set{// 设置 index 指定的值}
}
注意事项
- 属性的各种用法同样适用于索引器。 此规则的唯一例外是“自动实现属性”。 编译器无法始终为索引器生成正确的存储。
- 只要每个索引器的参数列表是唯一的,就可以对一个类型定义多个索引器。
代码示例
IndexNames类创建了基本的索引器,索引器内部对rectangles列表进行操作。
public class IndexNames
{public List<Rectangle> rectangles = new List<Rectangle>();public Rectangle this[int index]{get{if(this.rectangles[index] != null){Rectangle r = rectangles[index];return r;}return null;}set{if (index > 0 && index < rectangles.Count){rectangles[index] = value;}}}public IndexNames(){this.rectangles.Add(new Rectangle(10, 10));this.rectangles.Add(new Rectangle(20, 20));this.rectangles.Add(new Rectangle(30, 30));this.rectangles.Add(new Rectangle(40, 40));}
}
上面代码提到的Rectangle类
public class Rectangle
{// 成员变量protected double length;protected double width;public double Test;public Rectangle(double l, double w){length = l;width = w;}[DeBugInfo(55, "Zara Ali", "19/10/2012",Message = "Return type mismatch")]public double GetArea(){return length * width;}[DeBugInfo(56, "Zara Ali", "19/10/2012")]public void Display(){Console.WriteLine("Length: {0}", length);Console.WriteLine("Width: {0}", width);Console.WriteLine("Area: {0}", GetArea());}public void GetString(){Debug.Log($"Length:{length}width:{width}Area:{GetArea()}");}
}
表现
循环输出索引的内容
IndexNames indexs = new IndexNames();for (int i = 0; i < indexs.rectangles.Count; i++){indexs[i].GetString();}
输出:
总结
只要类中有类似于属性的元素就应创建索引器,此属性代表的不是一个值,而是值的集合,其中每一个项由一组参数标识。 这些参数可以唯一标识应引用的集合中的项。 索引器延伸了属性的概念,索引器中的一个成员被视为类外部的一个数据项,但又类似于内部的一个方法。 索引器允许参数在代表项的集合的属性中查找单个项。