C#學(xué)習(xí)日記28---索引器、重載索引器
來源:程序員人生 發(fā)布時(shí)間:2016-05-04 15:36:10 閱讀次數(shù):2426次
索引器允許類或結(jié)構(gòu)的實(shí)例就像數(shù)組1樣進(jìn)行索引,當(dāng)您為1個(gè)類定義1個(gè)索引器時(shí),這個(gè)類就會(huì)像1個(gè)數(shù)組1樣,您可使用數(shù)組訪問符 '[]' 對(duì)該類的實(shí)例進(jìn)行訪問.. 索引器與
屬性 類似,但是索引器要采取參數(shù),(也能夠這么認(rèn)為,索引器是1個(gè)類的屬性,一樣也是通過訪問器(1種特殊的方法) 實(shí)現(xiàn)的)
為了更清楚1點(diǎn),還是舉個(gè)例子吧, 大學(xué)是人生中最悠閑的時(shí)光,同學(xué)們可以做許多自己曾想做而由于種種緣由沒有做的事,逃課很明顯正是其中之1..為了制止逃課的行動(dòng),每次上課的時(shí)候老師都要點(diǎn)名或是點(diǎn)學(xué)號(hào),我是4班的,老師喜歡點(diǎn)學(xué)號(hào),"4班1號(hào)" 然后下面大聲答"到……",“4班2號(hào)”,“到”,“4班3號(hào)”......
"3號(hào)。。3號(hào)同學(xué)。。",“老師HC666今天肚子疼上醫(yī)院了”(中國(guó)好室友阿^_^),“哦,4號(hào)”..... 老師點(diǎn)名就是對(duì)4班的1個(gè)索引。
如果將class4看做是由Classes類實(shí)例化的1個(gè)對(duì)象,class[1]就是對(duì)1號(hào)同學(xué)的索引,(想想數(shù)組就明白了)那怎樣實(shí)現(xiàn)呢?
定義索引器:
上面也說了,索引器與屬性類似,自然也少不了get,set訪問器了,索引器也是類的成員,自然也得在類里面定義了,以下:
public 返回值類型 this[參數(shù)類型 參數(shù)]
{
get { return 參數(shù)指定的值; } //get訪問器
set { /*設(shè)置參數(shù)指定的值 */
} //set訪問器
}
索引器的實(shí)例:
我們將上面的例子代碼化,以下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test1
{//定義1個(gè)能被索引的類
class Classes
{//對(duì)類的索引實(shí)質(zhì)是對(duì)類中數(shù)組的索引
public string[] StudentName=new string[6];
//定義索引器
public string this[int ID]
{
get { return StudentName[ID]; }
set { StudentName[ID] = value; } //set訪問器自帶value參數(shù)
}
}
class Program
{
static void Main(string[] args)
{
Classes class4 = new Classes();
//索引寫入
for (int i = 1; i < 6; i++)
{
class4[i] = "HC"+i;
}
//索引讀出
for (int j = 1; j < 6; j++)
{
Console.WriteLine(j+"號(hào) "+class4[j]);
}
}
}
}
結(jié)果:

重載索引器:
上面的程序中,我們實(shí)現(xiàn)了通過學(xué)號(hào)索引出該學(xué)生姓名,那怎樣實(shí)現(xiàn)通過姓名索引出學(xué)號(hào)呢?我們將索引看做是1個(gè)特殊的方法,方法可以利用重載實(shí)現(xiàn)不同的參數(shù)相同的功能,那末索引器自然也能夠重載。用法與方法重載類似,(查看方法重載點(diǎn)這里),我們還是接著上面的例子,這次要滿足使用姓名索引出學(xué)號(hào):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test1
{//定義1個(gè)能被索引的類
class Classes
{//對(duì)類的索引實(shí)質(zhì)是對(duì)類中數(shù)組的索引
public string[] StudentName=new string[6];
//定義索引器
public string this[int ID]
{
get { return StudentName[ID]; }
set { StudentName[ID] = value; } //set訪問器自帶value參數(shù)
}
//重載索引器參數(shù)設(shè)為string類型
public uint this[string name]
{
get
{ //找到與name匹配的學(xué)號(hào)
uint index=1;
while (StudentName[index] != name && index < 6)
{ index++; }
return index;
}
set { }
}
}
class Program
{
static void Main(string[] args)
{
Classes class4 = new Classes();
//索引寫入
for (int i = 1; i < 6; i++)
{
class4[i] = "HC"+i;
}
//索引讀出,通過學(xué)號(hào)索引出姓名
for (int j = 1; j < 6; j++)
{
Console.WriteLine(j+"號(hào) "+class4[j]);
}
//通過姓名索引出學(xué)號(hào)
for (int k = 1; k < 6; k++)
{
string name="HC"+k;
Console.WriteLine(name+" "+class4[name]+"號(hào)");//對(duì)照上面用法1樣參數(shù)不1樣
}
}
}
}
結(jié)果:

在上面中我們說了當(dāng)1個(gè)類定義了索引器就能夠?qū)⑦@個(gè)類當(dāng)作數(shù)組1樣看待,那在學(xué)習(xí)
數(shù)組 的時(shí)候知道,數(shù)組有多維度的,索引器所在的類呢??我們遍歷數(shù)組用的foreach遍歷語句對(duì)這個(gè)類也能用嗎??我下1篇再作介紹吧!!(由于學(xué)校要短電了……)希望您繼續(xù)支持HC666^_^
您的建議與評(píng)論是我完善自我的動(dòng)力,感謝您的瀏覽,有毛病的地方歡迎指出來或私信我^_^
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)