熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#索引器

2013-11-13 09:43:46  來源: .NET編程 

  索引器概述

  索引器使得對象可按照與數組相似的方法進行索引

  get 訪問器返回值set 訪問器分配值

  this 關鍵字用於定義索引器

  value 關鍵字用於定義由 set 索引器分配的值

  索引器不必根據整數值進行索引由您決定如何定義特定的查找機制

  索引器可被重載

  索引器可以有多個形參例如當訪問二維數組時

  C#語言一個最令人感興趣的地方就是類的索引器(indexer)簡單說來所謂索引器就是一類特殊的屬性通過它們你就可以像引用數組一樣引用 自己的類顯然這一功能在創建集合類的場合特別有用而在其他某些情況下比如處理大型文件或者抽象某些有限資源等能讓類具有類似數組的行為當然也是 非常有用的本文就會引領你設置類來采用索引器但是首先讓我們概述下屬性這個概念以便了解些必要的背景知識

  屬性

  假如你曾經用VB編寫過程序那麼你應該很熟悉屬性方法才對所謂屬性方法其實就是特殊的類成員它實現了對私有類域的受控訪問在C#語言 中有兩種屬性方法其一是get通過它可以返回私有域的值其二是set通過它就可以設置私有域的值比如說以下面的代碼為例其間創建了一個 FirstName屬性由它控制對私有類成員firstname的訪問

            class Person {
        private string firstname;
        public string FirstName {
        get {return firstname;}
        set {firstname = value;}
        }
        }

  屬性聲明可以如下編碼          Person p = new Person();
        pFirstName = Lamont;
        ConsoleWriteLine (pFirstName);

  如你你所看到的那樣屬性聲明倒更像是域聲明只不過它還聲明了兩個特殊的成員按照微軟的說法就是所謂的訪問函數(accessor)當某 一表達式的右邊調用屬性或者屬性用作其他子程序(或者函數)的參數時即會調用get訪問函數反之當表達式左邊調用屬性並且通過隱式傳遞value參數 設置私有域值的情況下就會調用set訪問函數你可以創建只讀屬性方法是省略set訪問函數這樣任何設置屬性的嘗試都會產生編譯錯誤

  采用索引器的益處

  說了半天咱們轉到正題上來那麼為什麼我要兜這個圈子呢?其實這是因為類的索引器非常像屬性從代碼上看也是這樣以下是具有索引器的類示例通過索引器會返回一個字符串          class Sample {
        public string this [int index] {
        get {return You passed + index; }
        }
        }

  注意這裡的屬性名是this意思是回引類的當前實例參數列表包含在方括號而非括號之內還有這是一個只讀索引器為了把它改成讀/寫類 型我又添加了一個set訪問函數在定義索引器的時候你不一定只采用一個參數索引器參數可以采用任何類型不過int是通常采用也是最為合理的類 型同一類中還可能擁有一個以上的索引器(重載)

  如上定義了Sample類之後我們就可以把索引器用作某種默認的屬性如下所示          Sample s = new Sample();
        ConsoleWriteLine(s[]);

  屬性和索引器

  屬性和索引器之間有好些差別

  類的每一個屬性都必須擁有唯一的名稱而類裡定義的每一個索引器都必須擁有唯一的簽名(signature)或者參數列表(這樣就可以實現索引器重載)

  屬性可以是static(靜態的)而索引器則必須是實例成員

  為索引器定義的訪問函數可以訪問傳遞給索引器的參數而屬性訪問函數則沒有參數

  接口

  類似數組的行為常受到程序實現者的喜愛所以你還可以為接口定義索引器IList和 IDictionary集合接口都聲明了索引器以便訪問其存儲的項目

  在為接口聲明索引器的時候記住聲明只是表示索引器的存在你只需要提供恰當的訪問函數即可不必包括范圍修飾符以下代碼把索引器聲明為接口IImplementMe的一部分          interface IImplementMe {
        string this[int index]
        {
        get;
        set;
        }

  相應實現的類則必須為IimplementMe的索引器具體定義get和set訪問函數

  以上就是有關索引器的一些基本概述了現在你應該對索引器在你的開發中所具有的作用有了較深入的了解

  索引器允許類或結構的實例按照與數組相同的方式進行索引索引器類似於屬性不同之處在於它們的訪問器采用參數

  在下面的示例中定義了一個泛型類並為其提供了簡單的 get 和 set 訪問器方法(作為分配和檢索值的方法)Program 類為存儲字符串創建了此類的一個實例  

  class SampleCollection<T>
        {
            private T[] arr = new T[];
            public T this[int i]
            {
                get
                {
                    return arr[i];
                }
                set
                {
                    arr[i] = value;
                }
            }
        }

  // This class shows how client code uses the indexer
        class Program
        {
            static void Main(string[] args)
            {
                SampleCollection<string> stringCollection = new SampleCollection<string>();
                stringCollection[] = Hello World;
                SystemConsoleWriteLine(stringCollection[]);
            }
        }


From:http://tw.wingwit.com/Article/program/net/201311/11433.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.