索引器

索引器(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
        }
    }

 

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