C#索引器

來源:互聯網
上載者:User

引入:經常見有這樣的類:如aClass a = new Class();然後在程式裡出現個a[i]="some string";感覺好奇怪:既然沒有聲明類數組卻用[]索引,而且返回個string類型,

索引器概述:簡單說來,所謂C#索引器就是一類特殊的屬性,通過它們你就可以像引用數組一樣引用自己的類。

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

get 訪問器傳回值。set 訪問器分配值。

this 關鍵字用於定義索引器。

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

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

索引器可被重載。

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

C#語言一個最令人感興趣的地方就是類的索引器(indexer)。簡單說來,所謂索引器就是一類特殊的屬性,通過它們你就可以像引用數組一樣引用自己的類。顯然,這一功能在建立集合類的場合特別有用,而在其他某些情況下,比如處理大型檔案或者抽象某些有限資源等,能讓類具有類似數組的行為當然也是非常有用的。

 

和方法一樣,索引器有5種存取保護層級,和4種繼承行為修飾,以及外部索引器。這些行為同方法沒有任何差別,這裡不再贅述。唯一不同的是索引器不能為靜態(static),這在對象引用的語義下很容易理解。值得注意的是在覆蓋(override)實現索引器時,應該用base[E]來存取父類的索引器。

 

和屬性的實現一樣,索引器的資料類型同時為get語句塊的傳回型別和set語句塊中value關鍵字的類型。

索引器的參數列表也是值得注意的地方。“索引”的特徵使得索引器必須具備至少一個參數,該參數位於this關鍵字之後的中括弧內。索引器的參數也只能是傳實值型別,不可以有ref(引用)和out(輸出)修飾。參數的資料類型可以是C#中的任何資料類型。C#根據不同的參數簽名來進行索引器的多態辨析。中括弧內的所有參數在get和set下都可以引用,而value關鍵字只能在set下作為傳遞參數。

索引器通常用於對象容器中為其內的對象提供友好的存取介面--這也是為什麼C#將方法封裝成索引器的原因所在。實際上,我們可以看到索引器在.NET Framework類庫中有大量的應用。

 

屬性和索引器

   屬性和索引器之間的差別:

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

   屬性可以是static(靜態)而索引器則必須是執行個體成員。

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

 

要聲明類或結構上的索引器,使用 this 關鍵字(與屬性相似):

public int this[int index]    // Indexer declaration{    // get and set accessors}備忘

索引器類型及其參數類型必須至少如同索引器本身一樣是可訪問的。有關可存取層級的更多資訊,請參見存取修飾詞。索引器的簽名由其形參的數量和類型組成。它不包括索引器類型或形參名。如果在同一類中聲明一個以上的索引器,則它們必須具有不同的簽名。索引器值不歸類為變數;因此,不能將索引器值作為 ref 或 out 參數來傳遞。要為索引器提供一個其他語言可以使用的名字,請使用聲明中的 name 屬性。例如:

[System.Runtime.CompilerServices.IndexerName("TheItem")]public int this [int index]   // Indexer declaration{}此索引器將具有名稱 TheItem。不提供名稱屬性將產生 Item 預設名稱。 樣本 1 下面的樣本說明如何聲明私人數組欄位、arr 和索引器。使用索引器可直接存取執行個體 test[i]。另一種使用索引器的方法是將數組聲明為 public 成員並直接存取它的成員 arr[i]。C#複製代碼class IndexerClass{    privateint[] arr = newint[100];    publicintthis[int index]   // Indexer declaration    {        get        {            // Check the index limits.            if (index < 0 || index >= 100)            {                return 0;            }            else            {                return arr[index];            }        }        set        {            if (!(index < 0 || index >= 100))            {                arr[index] = value;            }        }    }} class MainClass{    staticvoid Main()    {        IndexerClass test = new IndexerClass();        // Call the indexer to initialize the elements #3 and #5.        test[3] = 256;        test[5] = 1024;        for (int i = 0; i <= 10; i++)        {            System.Console.WriteLine("Element #{0} = {1}", i, test[i]);        }    }} 輸出 Element #0 = 0 Element #1 = 0 Element #2 = 0 Element #3 = 256 Element #4 = 0 Element #5 = 1024 Element #6 = 0 Element #7 = 0 Element #8 = 0 Element #9 = 0 Element #10 = 0 請注意,當計算索引器的訪問時(例如,在 Console.Write 語句中),將調用 get 訪問器。因此,如果 get 訪問器不存在,將發生編譯時間錯誤。 使用其他值進行索引 C# 並不將索引類型限制為整數。例如,對索引器使用字串可能是有用的。通過搜尋集合內的字串並返回相應的值,可以實現此類的索引器。由於訪問器可被重載,字串和整數版本可以共存。 樣本 2 在此例中,聲明了儲存星期幾的類。聲明了一個 get 訪問器,它接受字串(天名稱),並返回相應的整數。例如,星期日將返回 0,星期一將返回 1,等等。C#複製代碼// Using a string as an indexer valueclass DayCollection{    string[] days = { "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" };     // This method finds the day or returns -1    privateint GetDay(string testDay)    {        int i = 0;        foreach (string day in days)        {            if (day == testDay)            {                return i;            }            i++;        }        return -1;    }     // The get accessor returns an integer for a given string    publicintthis[string day]    {        get        {            return (GetDay(day));        }    }} class Program{    staticvoid Main(string[] args)    {        DayCollection week = new DayCollection();        System.Console.WriteLine(week["Fri"]);        System.Console.WriteLine(week["Made-up Day"]);    }} 輸出 5 -1  可靠編程 提高索引器的安全性和可靠性有兩種主要的方法:當設定並檢索來自索引器訪問的任何緩衝區或數組的值時,請始終確保您的代碼執行範圍和類型檢查。應當為 get 和 set 訪問器的可訪問性設定儘可能多的限制。這一點對 set 訪問器尤為重要。有關更多資訊,請參見非對稱訪問器可訪問性(C# 編程指南)。  (來源:msdn ) 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.