C#实现索引器简单描述

开发 后端
这里介绍C#实现索引器,索引器(Indexer)是C#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用。

本文向大家介绍C#实现索引器,可能好多人还不知道C#实现索引器,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。

C#实现索引器

索引器(Indexer)是C#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用。索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。下面是典型的索引器的设计,我们在这里忽略了具体的实现。

  1. classMyClass{  
  2. publicobjectthis[intindex]  
  3. {  
  4. get  
  5. {  
  6. //取数据  
  7. }  
  8. set  
  9. {  
  10. //存数据  
  11. }  
  12. }  

索引器没有像属性和方法那样的名字,关键字this清楚地表达了索引器引用对象的特征。和属性一样,value关键字在set后的语句块里有参数传递意义。实际上从编译后的IL中间语言代码来看,上面这个索引器被实现为:

  1. classMyClass{  
  2. publicobjectget_Item(intindex)  
  3. {  
  4. //取数据  
  5. }  
  6. publicvoidset_Item(intindex,objectvalue){  
  7. //存数据  
  8. }  

由于我们的索引器在背后被编译成get_Item(int index)和set_Item(int index, object value)两个方法,我们甚至不能再在声明实现索引器的类里面声明实现这两个方法,编译器会对这样的行为报错。这样隐含实现的方法同样可以被我们进行调用,继承等操作,和我们自己实现的方法别无二致。通晓C#语言底层的编译实现为我们下面理解C#实现索引器的行为提供了一个很好的基础。

和方法一样,索引器有5种存取保护级别,和4种继承行为修饰,以及外部索引器。这些行为同方法没有任何差别,这里不再赘述。***不同的是索引器不能为静态(static),这在对象引用的语义下很容易理解。值得注意的是在C#实现索引器时,应该用base[E]来存取父类的索引器。

和属性的实现一样,索引器的数据类型同时为get语句块的返回类型和set语句块中value关键字的类型。

索引器的参数列表也是值得注意的地方。“索引”的特征使得索引器必须具备至少一个参数,该参数位于this关键字之后的中括号内。索引器的参数也只能是传值类型,不可以有ref(引用)和out(输出)修饰。参数的数据类型可以是C#中的任何数据类型。C#根据不同的参数签名来进行索引器的多态辨析。中括号内的所有参数在get和set下都可以引用,而value关键字只能在set下作为传递参数。

下面是一个索引器的具体的应用例子,它对我们理解索引器的设计和应用很有帮助。

  1. usingSystem;  
  2. classBitArray{int[]bits;  
  3. intlength;  
  4. publicBitArray(intlength){  
  5. if(length<0)thrownewArgumentException();  
  6. bits=newint[((length-1)>>5)+1];this.length=length;  
  7. }  
  8. publicintLength{  
  9. get{  
  10. returnlength;  
  11. }  
  12. }  
  13. publicboolthis[intindex]{  
  14. get{  
  15. if(index<0||index>=length)thrownewIndexOutOfRangeException();  
  16. elsereturn(bits[index>>5]&1<<index)!=0;  
  17. }  
  18. set{if(index<0||index>=length)thrownewIndexOutOfRangeException();  
  19. elseif(value)bits[index>>5]|=1<<index;elsebits[index>>5]&=~(1<<index);
  20. }
  21. }
  22. }
  23. classTest{staticvoidMain(){  
  24. BitArrayBits=newBitArray(10);  
  25. for(inti=0;i<10;  
  26. i++)Bits[i]=(i%2)==0;  
  27. Console.Write(Bits[i]+"");  
  28. }  

上面的程序通过索引器的使用为用户提供了一个界面友好的bool数组,同时又大大降低了程序的存储空间代价。索引器通常用于对象容器中为其内的对象提供友好的存取界面--这也是为什么C#将方法包装成索引器的原因所在。实际上,我们可以看到索引器在.NET Framework类库中有大量的应用。

【编辑推荐】

  1. C#窗体里调用浅谈
  2. C#调用ListEmployee命令
  3. C# CreateEmployeeDefinition()函数
  4. C#实现断点续传详细剖析
  5. C# Employee对象浅谈
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-10 16:40:03

C#索引器

2009-08-31 18:32:01

C# ListBoxE

2009-08-19 10:09:21

C#和C++

2009-08-21 17:31:58

C#垃圾回收

2009-09-02 13:01:11

C#多路广播

2009-09-16 09:01:40

C#多维数组

2009-08-28 09:30:48

C#命名属性

2009-09-01 18:25:32

C#结构实例

2009-09-07 14:33:02

C# switch语句

2009-08-13 17:58:34

C#存储过程

2009-08-27 10:01:52

C#自动属性

2009-09-07 15:31:49

C#支持事件

2009-08-20 16:45:03

C#哈希值

2009-09-01 17:08:35

C# Color枚举

2009-09-03 16:55:58

C#引用类型

2009-09-02 17:38:16

C#泛型支持

2009-08-26 14:54:23

C# new和over

2009-09-03 10:19:12

C#表单控件

2009-09-02 10:39:00

C#释放托管资源

2009-09-17 16:28:27

C#参差数组
点赞
收藏

51CTO技术栈公众号