索引器

索引器(indexer)允许一个对象可以像数组一样被索引,当为类定义一个索引器时,该类的行为就会像一个虚拟数组一样,可以使用数组访问运算符[ ]来访问该类的实例,索引器是一组get和set访问器,与属性类似。

索引器与属性的异同

(1)和属性一样,索引器不用分配内存来存储
(2)索引器和属性都主要被用来访问其他数据成员,它们与这些成员关联,并为它们提供获取和设置访问,只是属性通常表示单独的数据成员,索引器通常表示多个数据成员,索引器本身可以是任何类型,不仅仅是数值类型。
(3)和属性一样,索引器可以只有一个访问器,也可以俩个都有
(4)索引器总是实例成员,因此不能声明为static
(5)和属性一样,实现get和set访问器的代码不必一定要关联到某个字段或属性,这段代码可以做任何事情或什么也不做,只要get访问器返回某个指定类型的值即可
(6)和属性一样,不能显式调用get和set访问器,并且在set访问器中包含隐式参数value

声明索引器

(1)索引器没有名称,在名称的位置是关键字this
(2)参数列表在方括号
(3)参数列表中必须至少声明一个参数
(4)声明为public,以便从类的外部访问

索引器重载

类中的索引器如果想构成重载,则必须有不同的参数列表,仅是索引器类型不同是构不成重载的,这点类似于C++中的函数重载

    class A
    {
        public string s1;
        public string s2;
        public int i1;
        public int i2;

        public string this[int index]
        {
            set
            {
                switch(index)
                {
                    case 0:s1 = value;
                        break;
                    case 1:s2 = value;
                        break;
                    default:
                        throw new ArgumentOutOfRangeException("index");
                }
            }
            get
            {
                switch(index)
                {
                    case 0:return s1;
                    case 1:return s2;
                    default:
                        throw new ArgumentOutOfRangeException("index");
                }
            }
        }

        public int this[string index2]   //如果写成public int this[int index1]则会出错,这构不成重载,会造成二义性
        {  
            set
            {
                switch(index2)
                {
                    case "i1": i1 = value;
                        break;
                    case "i2":i2 = value;
                        break;
                    default:
                        throw new ArgumentOutOfRangeException("index2");
                }
            }
            get
            {
                switch(index2)
                {
                    case "i1":return i1;
                    case "i2":return i2;
                    default:
                        throw new ArgumentOutOfRangeException("index2");
                }
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            a[0] = "sss";
            a[1] = "ssss";
            Console.WriteLine(a.s1);  //sss
            Console.WriteLine(a.s2);  //ssss
            a["i1"] = 100;
            a["i2"] = 200;
            Console.WriteLine(a.i1);  //100
            Console.WriteLine(a.i2);  //200
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章