索引器
基础概念
索引器,将一个对象变的可以像数组一样使用下标访问,索引器的创建类似属性,都需要设置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();
}
输出:
总结
只要类中有类似于属性的元素就应创建索引器,此属性代表的不是一个值,而是值的集合,其中每一个项由一组参数标识。 这些参数可以唯一标识应引用的集合中的项。 索引器延伸了属性的概念,索引器中的一个成员被视为类外部的一个数据项,但又类似于内部的一个方法。 索引器允许参数在代表项的集合的属性中查找单个项。