快速瞭解c#中的索引器

來源:互聯網
上載者:User

 C#中的索引器是新增加的,和屬性有些不同。在c#中,屬性可以是這樣的:

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

set {firstname = value;}
}

}

屬性聲明可以如下編碼:
Person p = new Person();
p.FirstName = "TOM";
Console.WriteLine (p.FirstName);

屬性聲明倒更像是域聲明,只不過它還聲明了兩個特殊的成員,按照微軟的說法就是所謂的訪問函數(accessor)。當某一運算式的右邊調用屬性或者屬性用作其他子程式(或者函數)的參數時即會調用get訪問函數。反之,當運算式左邊調用屬性並且通過隱式傳遞value參數設定私人域值的情況下就會調用set訪問函數。
   索引器(Indexer)是C#引入的一個新型的類成員,它使得對象可以像數組那樣被方便,直觀的引用。索引器非常類似於我們前面講到的屬性,但索引器可以有參數列表,且只能作用在執行個體對象上,而不能在類上直接作用。下面是個例子:
  

using System;

namespace IndexerExample
{

Class MyPreviousExp
{
 private string[] myCompanies = new string[10];

 //index creation
 public string this[int index]
 {
 
  get
  {
   if(index <0 or index >= 6)
    return "null";
   else
    return myCompanies[index];
   
  }
  set
  {
   if(!(index <0 or index >= 10))
    myCompanies[index] = value;
  }
 
 }
}
Class myMainClass
{
 public static void Main()
 {
  myPreviousExp indexerObj = new myPreviousExp();
 
  indexerObj[0] = "AMS"
  indexerObj[3] = "HCL"
  indexerObj[5] = "ACC"
  for(int i=0; i<10; i++
  {   
  
   Console.WriteLine(" My Companies{0} : {1} ",i,indexerObj[i]);
  }
  
 }
}

}
  可見,我們象通過數組那樣,訪問到了其中的元素,而通過
myPreviousExp indexerObj = new myPreviousExp();
  建立了索引器,再通過
  indexerObj[0] = "AMS"
  indexerObj[3] = "HCL"
  indexerObj[5] = "ACC"
設定值
最後輸出為:
 

myCompanies 0 : AMS
myCompanies 1 :
myCompanies 2 :
myCompanies 3 : HCL
myCompanies 4 :
myCompanies 5 : ACC
myCompanies 6 : null
myCompanies 7 : null
myCompanies 8 : null
myCompanies 9 : null

相關說明:

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

屬性  

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

class person {

private string firstname; public string firstname

{ get {return firstname;}

set {firstname = value;}

}

}

屬性聲明可以如下編碼

person p = new person();

p.firstname = "lamont"; console.writeline (p.firstname);

  如你你所看到的那樣,屬性聲明倒更像是域聲明,只不過它還聲明了兩個特殊的成員,按照微軟的說法就是所謂的訪問函數(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(); console.writeline(s[55]);   

屬性和索引器   

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

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

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

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

介面  

類似數組的行為常受到程式實現者的喜愛,所以你還可以為介面定義索引器,ilist和 idictionary集合介面都聲明了索引器以便訪問其儲存的項目。  

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

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.