索引器与属性的不同点:

  1、每个属性的名称必须唯一,而每一个索引器的签名必须唯一。

  2、索引器的“属性名”统一为this。而不能为其他,专门用于定义索引器。

  3、索引器的参数列表包含在方括号而不是圆括号之内。

  4、属性可以是静态的,而索引器只能为实例成员。

  5、属性的get访问器没有参数,而索引器的get访问器可以有参数,而且索引器的get访问器和set访问器的参数相同

  6、索引器可以有多个形参,比如访问多维数组时。

索引器和数组对比:

              数组          索引器

  索引类型        整型,0-n        可以为任意类型

  是否存储数据      是           否,通过访问器操作存在其他地方的数据,例如集合或数组字符串等。

  是否允许重载      否            是,一个类可以有多个索引器

标准范例:

using System;
using System.Collections.Generic;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Index index = new Index();
            Console.WriteLine(index[1]);    //输出 刘备
            Console.WriteLine(index[2]);    //输出 关羽
            Console.WriteLine(index[3]);    //输出 张飞

            index[3] = "诸葛亮";
            Console.WriteLine(index[3]);    //输出 诸葛亮

            Console.ReadKey();
        }
    }

    public class Index
    {
        IDictionary<int, string> Dictionary = new Dictionary<int, string>
        {
            { 1,"刘备"},
            { 2,"关羽"},
            { 3,"张飞"},
        };
        public string this[int Id]
        {
            get
            {
                if (Dictionary.ContainsKey(Id))
                    return Dictionary[Id];
                throw new Exception("不存在对应的ID");
            }
            set
            {
                if (Dictionary.ContainsKey(Id))
                    Dictionary[Id] = value;
                else
                    throw new Exception("不存在对应的ID");
            }
        }
    }
}
View Code

 

注意:当类中有[Item]这个属性名称时 使用索引器会导致一个编译错误

错误    1    类型“ConsoleApp.BitArray”已经包含“Item”的定
解决方案:
C#允许我们通过在索引器上使用[System.Runtime.CompilerServices.IndexerName("索引名称")]这个特性来避免这种名称的冲突
但是要注意当使用了IndexerName特性时 所有的索引器的名称 都必须一致 不然C#编译器就会报错。
using System;
using System.Collections.Generic;

namespace ConsoleApp
{
    class BitArray
    {

        private List<int> intList = new List<int>();
        public int Item { get; set; }


        [System.Runtime.CompilerServices.IndexerName("Bit")]
        public int this[int bitPos]
        {
            set
            {
                intList[bitPos] = value;
            }
            get
            {
                return intList[bitPos];
            }
        }

        //[System.Runtime.CompilerServices.IndexerName("Chars")]   如果使用的名称不一致 就会编译报错
        [System.Runtime.CompilerServices.IndexerName("Bit")]
        public int this[string str]
        {
            get { return 0; }
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Console.ReadLine();
        }
    }
}
View Code