C#索引器

索引器(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所指向的地址,再通过此地址对实例进行操作。

原文地址:https://www.cnblogs.com/lhard/p/2136621.html