概念
一组get和set访问器,与属性类似
索引器和属性
相同
- 和属性—样,索引器不用分配内存来存储。
 - 和属性一样,索引器可以只有一个访问器,也可以两个都有。
 - 和属性一样,实现get和set访问器的代码不必一定要关联到某个字段或属性。这段代码可以做任何事情或什么也不做,只要get访问器返回某个指定类型的值即可。
 
不同
- 索引器和属性都主要被用来访问其他数据成员,它们与这些成员关联,并为它们提供获取和设置访问。
- 属性通常表示单独的数据成员。
 - 索引器通常表示多个数据成员。
 
 - 索引器总是实例成员。因此不能声明为static。
 
可以认为索引器是为类的多个数据成员提供get和set的属性
声明索引器
规则
- 索引器没有名称。在名称的位置是关键字this。
 - 参数列表在方括号中间。
 - 参数列表中必须至少声明一个参数。
 
语法
void this[int index]
{
    set {
    }
    get {
    }
}
索引器的set访问器
当使用索引器获取值时,可以通过一个或多个索引参数调用get访问器被。索引参数指示获取哪个值。
- 它的参数列表和索引器声明中的相同。
 - 它返回与索引器相同类型的值。
 
和属性一样,不能显式调用get和set访问器
例
class Employee
{
    public string LastName;         //调用字段0
    public string FirstName;        //调用字段1
    public string CityOfBirth;      //调用字段2
    public string this[int index]
    {
        set
        {
            switch (index)
            {
                case 0:
                    LastName = value;
                    break;
                case 1:
                    FirstName = value;
                    break;
                case 2:
                    CityOfBirth = value;
                    break;
                default:
                    throw new ArgumentOutOfRangeException("index");
            }
        }
        get
        {
            switch (index)
            {
                case 0: return LastName;
                case 1: return FirstName;
                case 2: return CityOfBirth;
                default:
                    throw new ArgumentOutOfRangeException(null);
            }
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        Employee e = new Employee();
        e[0] = "LastName";
        Console.WriteLine($"{e[0]}");
        Console.ReadKey();
    }
}
结果
LastName
索引器重载
class MyClass
{
    public string this[int index]
    {
        get{}
        set{}
    }
    public string this[int index]
    {
        get{}
        set{}
    }
}