属性和索引器的差别:一个对象只有一个属性值,所以要存放多个值必须实例化多个对象(通常情况下,实例化一个数组的对象,接着实例化的对象赋给这个数组)。一个对象对应的索引是一个数组,并且可以存放多个数值或字符串,所以只需要实例化一个对象就可以存放以及访问多个存储内容。
using System;
using System.Collections.Generic;

namespace aaa
{

public class arrClass{ //通过构造方法以及属性进行赋值
   private string name;//定义一个字段
   public string Name{ //定义一个属性,通过属性来修改name字段的值
    get{return name;} //通过Name来获取name的值
    set{name=value;} //通过Name将值赋给name字段
   }
   public arrClass(string name){ //构造函数,实例化一个对象就执行一次
    this.Name=name; //把实例化对象带进来的参数name赋值给Name属性
   }
}

class indexer{ //创建一个索引器类
   private string[] name=new string[10];//定义一个索引字段数组,也可以为int[]
   public string this[int index]{ //定义索引器,string是索引器类型,this来定义索引器
    get{return name[index];} //index就是string里面的数值,获取name[index]的值,例如获取name[3]的值
    set{name[index]=value;} //将值赋值给name[index]。例如把字符串"dengyun"赋值给name[3]
   }
}

class index1{ //这里又创建了一个索引器类
   private int[] age=new int[10]; //这边索引器字段的值为int型的
   public int this[int index]{
    get {return age[index];} //获取age[index]的值
    set {age[index]=value;} //赋值
   }
}

class MainClass{
   public static void Main(string[] args) //主方法一定要为static
   {
    indexer b=new indexer(); //实例化一个索引对象b,b有点类似数值b[10],这是索引器的特别之处
    b[0]="张三";//这里面b[index]的index为0,赋值“张三”给b[0]
    b[1]="李四";//赋值“李四”给b[1]
    b[2]="王五";//赋值“王五”给b[2]
    Console.WriteLine(b[0]);//输出b[0],可以理解为数值就存放在数组b中。
    Console.WriteLine(b[1]);
    Console.WriteLine(b[2]);
  
    arrClass[] a = new arrClass[10];//实例化一组对象,实例化一整个数组的对象
    a[0]=new arrClass("张三");//实例化一个对象,将它存入实例化的数组a中,它的存放位置是a[0]
    a[1]=new arrClass("李四");
    a[2]=new arrClass("王五");
    Console.WriteLine(a[0].Name);//通过对象来访问自己的属性值来输出数值
    Console.WriteLine(a[1].Name);
    Console.WriteLine(a[2].Name);
  
    index1 i = new index1(); //和带属性的类相比,索引器类只需要实例化一个对象
    i[0]=18;
    i[1]=22;
    i[9]=9;
    i[10]=10;//索引超出了,报错。
    Console.WriteLine(i[0]);
    Console.WriteLine(i[1]);
    Console.WriteLine(i[9]);
    Console.WriteLine(i[10]);
    Console.Read();
   }
}
}