C#索引器是封装性的体现

一说到面向对象我们马上会想到封闭,继承,多态.而封装性的具体体现最容易想到的是属性,把字段设成private,然后弄一个public的属性,使用get,set去访问,赋值.

其实比较令人费解的索引器也跟属性一样是体现封装性.

class IndexTest

{

//private int num;

//public int Num

//{get;set;}

private int[] array = new int[3];

public int this[int index]

{

get

{

if (index < 0 || index > 2)

return 0;

else

return array[index];

}

set

{

if (index >= 0 && index < 3)

array[index] = value;

}

}

}

class Program

{

static void Main(string[] args)

{

IndexTest test = new IndexTest();

for (int i = 0; i < 3; i++)

test[i] = i;

Console.WriteLine(test[1]);

}

}

刚一看索引器的用法总觉得怪怪的,其实说到底它的用处跟属性完全一样的.只是属性不能把数组下标当参数传进去.没办法才整出个this[int index]这样怪怪的写法.其实我们如果把this改成ArrayTest[int index]这样就较容易理解点.

不过我们发现用this的话有个局限性,假如里面还有个数组private int eno[] = new int[3];那咋整?自然不能再用this[int index]了.如果实在要碰到这种情况只能采取些变态点的方法了啊.比如用this[string index],然后index取值one,two,three之类的,再用switch一下,判断这些字符串,再取对应的eno[0],eno[1]...或者更变态点,在this[int index]中如果index是0,1,2则代表num,是3,4,5代表eno.但如果多几个数组咋整?真不知道咋整.也不知道为啥不设计成我刚说的ArrayTest[int index]这种样子,这样就跟属性完全一样,只不过多了个参数.

不过其实不管是属性还好,索引器还好,你未必一定要弄个private的字段,然后封装下.其实你直接整成个public int num,public int[] array的也不是不行.只是没有了封装性的一些好处,比如做些判断处理之类的.

其实事件(event)也有点像是对代理(delegate)的封装,只不过它显得更加复杂点.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值