索引可以让我们像数组那样访问类的数据成员。
下面定义一个“立方体类”,它有长、宽、高三个属性。
static void Main(string[] args)
{
Cube box = new Cube(6, 5, 4);
Console.WriteLine("长:{0}", box[0]);
Console.WriteLine("宽:{0}", box[1]);
Console.WriteLine("高:{0}", box[2]);
//计算面积
double area = 2 * (box[0] * box[1] + box[1] * box[2] + box[2] * box[0]);
Console.WriteLine("面积:{0}", area);
//计算体积
double volume = 1;
for (int i = 0; i <= 2; i++)
{
volume *= box[i];
}
Console.WriteLine("体积:{0}", volume);
}
}
//定义立方体类
class Cube
{
//私有变量成员
private double length;
private double width;
private double height;
//构造函数
public Cube(double lengthValue, double widthValue, double heightValue)
{
length = lengthValue;
width = widthValue;
height = heightValue;
}
//索引
public double this[int index]
{
get
{
switch (index)
{
case 0: return length;
case 1: return width;
case 2: return height;
default:
//当下标出界时,我们抛出一段异常。
throw new IndexOutOfRangeException("下标出界!");
}
}
set
{
switch (index)
{
case 0: length = value; break;
case 1: width = value; break;
case 2: height = value; break;
default:
//当下标出界时,我们抛出一段异常。
throw new IndexOutOfRangeException("下标出界!");
}
}
}
索引的函数体与属性类似,也是用get 和set 访问器。get 访问器用于获取成员变量的值,set 访问器用于为成员变量赋值。
索引的使用方法和数组完全一样,如果我们创建了一个名为 box 的Cube 对象,就可以用box[0],box[1],box[2]分别表示立方体的长、宽、高了。
运行结果如图:
在数组中,下标只能为整数,在索引中,有了更灵活的选择,既可以为 int 型,也可以为double、string 等类型。
接下来,以字符串为下标的索引例子:
class Program
{
static void Main(string[] args)
{
Cube box = new Cube(6, 5, 4);
Console.WriteLine("长:{0}", box["length"]);
Console.WriteLine("宽:{0}", box["width"]);
Console.WriteLine("高:{0}", box["height"]);
//计算体积
double volume = box["length"] * box["width"] * box["height"];
Console.WriteLine("体积:{0}", volume);
}
}
class Cube
{
//私有变量成员
private double length;
private double width;
private double height;
//构造函数
public Cube(double lengthValue, double widthValue, double heightValue)
{
length = lengthValue;
width = widthValue;
height = heightValue;
}
//索引
public double this[string indexString]
{
get
{
switch (indexString)
{
case "length": return length;
case "width": return width;
case "height": return height;
default:
//当下标出界时,我们抛出一段异常。
throw new IndexOutOfRangeException("下标出界!");
}
}
set
{
switch (indexString)
{
case "length": length = value; break;
case "width": width = value; break;
case "height": height = value; break;
default:
//当下标出界时,我们抛出一段异常。
throw new IndexOutOfRangeException("下标出界!");
}
}
}
}
运行结果如图:
C#还为我们提供了多维索引,只需提供多个下标即可,比如
public double this[int rowIndex,int columnIndex]//Matrix 类中的多维索引
这时需要嵌套的switch 语句或双重循环语句等方式来实现。