索引器允許物件被索引,例如:陣列。 當為類定義索引器時,此類與虛擬陣列類似。可以使用陣列存取運算子([]
)存取此類的範例。
一維索引器的語法如下:
element-type this[int index]
{
// The get accessor.
get
{
// return the value specified by index
}
// The set accessor.
set
{
// set the value specified by index
}
}
索引器的行為宣告在某種程度上與屬性相似。與屬性類似,可以使用get
和set
存取器定義索引器。但是,屬性返回或設定特定的資料成員,而索引器從物件範例返回或設定特定值。 換句話說,它將範例資料分解成較小的部分,並對每個部分進行索引,獲取或設定每個部分。
定義屬性涉及提供屬性名稱。索引器不是用名稱定義的,而是使用這個參照物件範例的關鍵字。以下範例演示了以下概念:
using System;
namespace IndexerApplication
{
class IndexedNames
{
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames()
{
for (int i = 0; i < size; i++)
namelist[i] = "N. A.";
}
public string this[int index]
{
get
{
string tmp;
if (index >= 0 && index <= size - 1)
{
tmp = namelist[index];
}
else
{
tmp = "";
}
return (tmp);
}
set
{
if (index >= 0 && index <= size - 1)
{
namelist[index] = value;
}
}
}
static void Main(string[] args)
{
IndexedNames names = new IndexedNames();
names[0] = "Maxsu";
names[1] = "Sukida";
names[2] = "Mark";
names[3] = "Jame";
names[4] = "Davinder";
names[5] = "Lucy";
names[6] = "Lily";
for (int i = 0; i < IndexedNames.size; i++)
{
Console.WriteLine(names[i]);
}
Console.ReadKey();
}
}
}
當上述程式碼被編譯並執行時,它產生以下結果:
Maxsu
Sukida
Mark
Jame
Davinder
Lucy
Lily
N. A.
N. A.
N. A.
索引器可以過載。索引器也可以宣告為多個引數,每個引數可能是不同的型別。 索引不一定是整數。 C# 允許索引為其他型別,例如:字串。
以下範例演示了過載的索引器:
using System;
namespace IndexerApplication
{
class IndexedNames
{
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames()
{
for (int i = 0; i < size; i++)
{
namelist[i] = "N. A.";
}
}
public string this[int index]
{
get
{
string tmp;
if (index >= 0 && index <= size - 1)
{
tmp = namelist[index];
}
else
{
tmp = "";
}
return (tmp);
}
set
{
if (index >= 0 && index <= size - 1)
{
namelist[index] = value;
}
}
}
public int this[string name]
{
get
{
int index = 0;
while (index < size)
{
if (namelist[index] == name)
{
return index;
}
index++;
}
return index;
}
}
static void Main(string[] args)
{
IndexedNames names = new IndexedNames();
names[0] = "Maxsu";
names[1] = "Richer";
names[2] = "Nuber";
names[3] = "DockJ";
names[4] = "Vadder";
names[5] = "Sukida";
names[6] = "Ruby";
//using the first indexer with int parameter
for (int i = 0; i < IndexedNames.size; i++)
{
Console.WriteLine(names[i]);
}
//using the second indexer with the string parameter
Console.WriteLine(names["Nuha"]);
Console.ReadKey();
}
}
}
當上述程式碼被編譯並執行時,它產生以下結果:
Maxsu
Richer
Nuber
DockJ
Vadder
Sukida
Ruby
N. A.
N. A.
N. A.
10