C#教程第十一課:索引指標
最後更新:2017-02-28
來源:互聯網
上載者:User
教程|索引 本節課將介紹C#的索引指標,其目的包括:
1.瞭解什麼是索引指標
2.如何?索引指標
3.重載索引指標
4.瞭解如何?多參數的索引指標
索引指標並不難使用。它們的用法跟數組相同。在一個類內部,你可以按照你的意願來管理一組資料的集合。這些對象可以是類成員的有限集合,也可以是另外一個數組,或者是一些複雜的資料結構。不考慮類的內部實現,其資料可以通過使用索引指標來獲得。如下是一個例子:
1.清單 11-1. 索引指標的例子:IntIndexer.cs
using System;
///
/// A simple indexer example.
///
class IntIndexer
{
private string[] myData;
public IntIndexer(int size)
{
myData = new string[size];
for (int i=0; i < size; i++)
{
myData[i] = "empty";
}
}
public string this[int pos]
{
get
{
return myData[pos];
}
set
{
myData[pos] = value;
}
}
static void Main(string[] args)
{
int size = 10;
IntIndexer myInd = new IntIndexer(size);
myInd[9] = "Some Value";
myInd[3] = "Another Value";
myInd[5] = "Any Value";
Console.WriteLine("\nIndexer Output\n");
for (int i=0; i < size; i++)
{
Console.WriteLine("myInd[{0}]: {1}", i, myInd[i]);
}
}
}
說明
1.清單 11-1示範了如何?一個索引指標, IntIndexer類有個名為myData的字串數組,該數組是私人成員,因而其外部成員是看不見的。該數組是在建構函式中進行初始化的,該建構函式帶有一個整型size參數,用來初始化myData數組,初始化時 把單詞"empty"作為每個數組元素的值。
2.IntIndexer類的下一成員是索引指標(Indexer),由關鍵字this和方括弧[int pos]標識出來。該成員帶有一個位置參數pos。正如你已經猜測到,Indexer的實現同屬性一樣。Indexer有get 和set訪問操作,就同屬性中的用法一樣。索引指標(indexer)返回一個字串,在定義索引指標時,string這個類型名標誌著其傳回型別為字串類型。
3.Main()方法完成如下事情:初始化一個新的IntIndexer對象,添加一些值,並且列印出結果。其輸出結果如下:
Indexer Output
myInd[0]: empty
myInd[1]: empty
myInd[2]: empty
myInd[3]: Another Value
myInd[4]: empty
myInd[5]: Any Value
myInd[6]: empty
myInd[7]: empty
myInd[8]: empty
myInd[9]: Some Value
4.在不少程式語言中,通常都是使用整數作為下標來訪問作為數組元素的,但C#的索引指標不僅能夠做到這一點,而且還能夠更進一步。 定義索引指標時,可以帶有多個參數,每個參數的類型可以不同。添加的參數由逗號隔開,同方法中的的參數表一樣。索引指標的合法的參數類型包括:整型,枚舉類型和字串。另外,索引指標也可以被重載。在清單 11-2中,我們修改了前面的程式,以便用來重載索引指標 ,從而可以接受不同類型的參數。
2.清單 11-2. 重載的索引指標: OvrIndexer.cs
using System;
///
/// Implements overloaded indexers.
///
class OvrIndexer
{
private string[] myData;
private int arrSize;
public OvrIndexer(int size)
{
arrSize = size;
myData = new string[size];
for (int i=0; i < size; i++)
{
myData[i] = "empty";
}
}
public string this[int pos]
{
get
{
return myData[pos];
}
set
{
myData[pos] = value;
}
}
public string this[string data]
{
get
{
int count = 0;
for (int i=0; i < arrSize; i++)
{
if (myData[i] == data)
{
count++;
}
}
return count.ToString();
}
set
{
for (int i=0; i < arrSize; i++)
{
if (myData[i] == data)
{
myData[i] = value;
}
}
}
}
static void Main(string[] args)
{
int size = 10;
OvrIndexer myInd = new OvrIndexer(size);
myInd[9] = "Some Value";
myInd[3] = "Another Value";
myInd[5] = "Any Value";
myInd["empty"] = "no value";
Console.WriteLine("\nIndexer Output\n");
for (int i=0; i < size; i++)
{
Console.WriteLine("myInd[{0}]: {1}", i, myInd[i]);
}
Console.WriteLine("\nNumber of \"no value\" entries: {0}", myInd["no value"]);
}
}
說明
1.清單 11-2 示範了如何重載索引指標。
帶有整型參數pos的第一個索引指標同清單11-1中的一樣,但是,該程式中有個帶有字串參數的新的索引指標。對於這個新的索引指標來說,其get操作返回的是同參數值data相匹配的成員的個數。 Set操作把數組中同參數值匹配的元素值該變為value值。
2.在清單11-2的Main()方法中,示範了重載的索引指標,它接受字串參數。
該重載的索引指標調用了set操作,通過使用下列命令: myInd["empty"] = "no value"; set操作把"no value"值賦給myInd 類中所有的值為"empty"的成員。 myInd類的每個成員都已經輸出之後,就把最後一個資料輸出到控制台,該資料統計數群組成員值為"no value"的個數。 使用如下命令:myInd["no value"],就可調用get操作。輸出結果如下:
Indexer Output
myInd[0]: no value
myInd[1]: no value
myInd[2]: no value
myInd[3]: Another Value
myInd[4]: no value
myInd[5]: Any Value
myInd[6]: no value
myInd[7]: no value
myInd[8]: no value
myInd[9]: Some Value
Number of "no value" entries: 7
3.在清單 11-2中,兩個索引指標共處在同一個類中, 這是可以的,因為它們有不同的特徵。
一個索引指標的特徵是通過索引指標參數表中的參數個數和類型表現出來的。類能夠辨別出其特徵,並調用相應的索引指標。帶有多個參數的索引指標可以用如下格式來實現:
public object this[int param1, ..., int paramN]
{
get
{
// process and return some class data
}
set
{
// process and assign some class data
}
}
小結
現在你已經瞭解了索引指標是用來做什麼的,以及其用法。如同數組的用法一樣,你可以建立索引指標來訪問類的成員。本文也提到了索引指標的重載和多參數索引指標。