类的索引器<索引器可以像方法一样重载>(一步步集合案例分析)

案例3:<案例分析>

namespace _2011._12._19
{
class Program
{
static void Main(string[] args)
{
Box box = new Box(10, 20, 30);
Display(box[0],box[1],box[2]);
Console.WriteLine(box["High"]);
box[1] = 100;//set Width is 100
Display(box[0], box[1], box[2]);
box["high"] = 500;
Display(box[0], box[1], box[2]);
Console.WriteLine(box["High"]);

}

static void Display<T>(params T[] array)//泛型接口方法
{
for (var i = 0; i < array.Length;i++ )
{
Console.WriteLine("box[{0}] is :{1}",i,array[i]);
}
}

}

class Box

{
public Box(double length, double width, double high)//构造函数
{
double_num[0] = length;
double_num[1] = width;
double_num[2] = high;
}
private string[] names = { "length","width","high"};//一个对象被建立,是先初始化类的对象(实例),然后再到构造函数

private double[] double_num = new double[3];

public double this[int index]
{
set
{
if (index >= 0 && (index < double_num.Length))
{
double_num[index] = value;
}

}

get
{
if (index < 0 || (index >= double_num.Length))
{
return -1;
}
else
{
return double_num[index];
}
}
}

public double this[string name]
{
get
{
int i = 0;
while((i<names.Length)&&(name.ToLower() !=names[i]))
{
++i;
}

return (i==names.Length)? -1:double_num[i];
}

set
{
int i = 0;
while ((i < names.Length) && (name.ToLower() != names[i]))
{
++i;
}
if (i != names.Length)
{
double_num[i] = value;
}
}
}
}
}




/*
The Result:
box[0] is :10
box[1] is :20
box[2] is :30
30
box[0] is :10
box[1] is :100
box[2] is :30
box[0] is :10
box[1] is :100
box[2] is :500
500
*/


1.程序进入Main函数入口
2.声明Box类的变量,新建对象,让变量指向该对象的内存地址
3.注意:这个时候是进入类里,先初始化类里的变量,也就是初始化实例(对象) 注意:private int i ;这里只是声明一个变量,没有初始化,所以不会给他初始化,这里
的数组为什么初始化了,因为:

private string[] names = { "length","width","high"};//一个对象被建立,是先初始化实例,然后再到构造函数
private double[] double_num = new double[3];



4.第四步才是运行构造函数,给类的变量成员赋值
5.调用了Display方法,这个时候不是直接去把参数传递方法,而是先去类里的Get属性,先做判断,合法的读取才能传递给方法(有几个变量就要判断几次)
6.然后再调用方法的运行过程,完成一系列的动作
7.Console.WriteLine(box["High"]);这个是调用Console类的方法,同理,也是先去类里Get属性判断是否合法,根据索引器里的索引号是什么属性,如果是字符串类型,那么就交给对应的索引器
8.细说下代码:
           

get
{
int i = 0;
while((i<names.Length)&&(name.ToLower() !=names[i]))
{
++i;
}

return (i==names.Length)? -1:double_num[i];
}



:i<names.Length-true,如果name.ToLower()==names[i],那么while循环将不执行
:如果while循环为true,那么i自增,然后直到找到与name.ToLower()对应的names[i]
:return 下面用于判断了下结果,当结果i=3的时候,因为索引号是0-2,那么当等于3的时候,说明,没有包含这个name.ToLower(),所以返回一个-1.
9.然后WriteLine方法输出结果
10.box[1]=100;这是给类的box变量对应的对象赋值,那么就要到set属性里去判断,这里是索引号的号码类型是整型,那么就会去对应的索引器去set.
11.下面同理

posted @ 2011-12-19 13:51  Anleb  阅读(659)  评论(5编辑  收藏  举报