索引器(indexer)
索引器允许类或结构的实例按照与数组相同的方式进行索引。
索引器类似于属性,不同之处在于它们的访问器采用参数。
一、索引器与数组类的区别:
数组类声明了多个实例,其内容存储在托管堆中,每个实例声明的名称都指向所对应的托管堆。
索引器只需要声明一个实例,其内容存储在索引器的一个数组中。索引器的索引不只是int型,还
可以是其它类型。
using System.Collections; internal class ArrClass//没有索引器的类 { private readonly string name; public ArrClass(string name) { this.name=name; } public string Name { get { return name; } } } internal class IndexClass//有索引器的类 { private Hashtable age=new Hashtable();//① public int this[string index] { get { return System.Convert.ToInt32(age[index]); } set { age.Add(index,value); } } } internal class Test { static void Main()//主函数 { //数组的访问 ArrClass[] a=new ArrClass[10]; a[0]=new ArrClass("tom"); a[1]=new ArrClass("lilly"); System.Console.WriteLine(a[0].Name+" "+a[1].Name); //索引器的访问 IndexClass b=new IndexClass(); b["A0"]=12; b["A1"]=22; System.Console.WriteLine(b["A0"]+" "+b["A1"]); } }
注①:Hashtable的使用
在.net Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似
Key/value的键值对,其中Key通常用来快速查找,同时Key是区分大小写;value用于存储对应于key的值。
Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的Key/value键值对。
Hashtable中存放的类型是DictionaryEntry类型
索引器与数组的比较(概括性总结):
●索引器的索引值(Index)类型不受限为整数
用来访问数组的索引值(Index),其类型一定为整数,然而索引器可以定义其他类型的索引值。
●索引器允许重载(Overloading)
一个类并不限制只能够定义一个索引器,只要索引器的函数签名不同,一个类就可以拥有很多
个索引器,你可以重载它的功能。
●索引器不是一个变量
索引和数组不同的地方在于,索引器并没有直接对应应用数据存储的地方,而数组则有。
索引器有get访问器与set访问器,用来指明要读取或写入索引器元素,时,需要执行的代码。
索引器与属性的不同点(概括性总结):
●标识方式:属性以名称来标识;索引器则以函数签名来标识。
●索引器可以被重载:因为属性是以名称标识的,所以不能被重载;索引器是用函数签名标识的,因此
可以重载。
●索引器不可以声明为static;属性可以为static,而索引器永远属于实例成员,不能为static。
二、索引器可以有多个索引(index),并且索引类型可以不同
例:
public int this[string name,int couseID] { get; set; }
三、数组及类在内存中的储存原理
数组的存储原理:
当声明一个数组(new int[3])时,会在托管堆中创建三个int型(4字节)的内存空间,并将此托管堆的地址赋值给a。在对数组进行操作时先从堆栈中取出a所指向的地址,再读取托管堆中对应的内容。
类的存储原理:
当声明一个类数组(new ArrClass[3])时,会在托管堆中创建三个ArrClass类的实例,并将此托管堆的地址赋值给a。在对类数组进行操作时先从堆栈中取出a所指向的地址,再通过此地址对实例进行操作。