-
C#中索引器的實作過程收藏
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存取函數,這樣任何設定屬性的嘗試都會產生編譯錯誤。
採用索引器的益處
下面是它的結構
...{
get
...{
// Get codes goes here
}
set
...{
// Set codes goes here
}
}
註:
modifier:修飾詞,如private, public, protected or internal
this:在C#中this是一個特殊的關鍵字,它表示引用類別的當前實例。在這裡它的意思是當前類別的索引。
argument list:這裡指索引器的參數。
說了半天咱們轉到正題上來,那為什麼我要去兜這個圈子呢?其實,這是因為類別的索引器非常像屬性,從程式碼來看也是這樣。以下是具有索引器的類別範例,透過索引器會傳回一個字串:
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存取函數。
以上就是有關索引器的一些基本概述了。現在你應該對索引器在你的開發中所具有的作用有了較深入的了解。
class SampleCollection
{
private T[] arr = new T[100];
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
stringCollection[0] = "Hello, World";
System.Console.WriteLine(stringCollection[0]);
}
}
本文來自CSDN博客,轉載請標示出處: http://blog.csdn.net/licheng19891020/archive/2009/12/09/4974516.aspx
-