c#索引器介绍|C#索引器写法|c#索引器例子
??索引器就是特殊的屬性,以下是最簡(jiǎn)單的索引器例子
就是給定索引編號(hào)去找索引編號(hào)對(duì)應(yīng)的值,類(lèi)似屬性的數(shù)組
?public string this[string configName]
??????? {
??????????? get
??????????? {
??????????????? return System.Configuration.ConfigurationManager.AppSettings[configName];
??????????? }
??????? }
?
索引器使得對(duì)象可按照與數(shù)組相似的方法進(jìn)行索引。
get 訪問(wèn)器返回值。set 訪問(wèn)器分配值。
this 關(guān)鍵字用于定義索引器。
value 關(guān)鍵字用于定義由 set 索引器分配的值。
索引器不必根據(jù)整數(shù)值進(jìn)行索引,由您決定如何定義特定的查找機(jī)制。
索引器可被重載。
索引器可以有多個(gè)形參,例如當(dāng)訪問(wèn)二維數(shù)組時(shí)。
C#語(yǔ)言一個(gè)最令人感興趣的地方就是類(lèi)的索引器(indexer)。簡(jiǎn)單說(shuō)來(lái),所謂索引器就是一類(lèi)特殊的屬性,通過(guò)它們你就可以像引用數(shù)組一樣引用自己的類(lèi)。顯然,這一功能在創(chuàng)建集合類(lèi)的場(chǎng)合特別有用,而在其他某些情況下,比如處理大型文件或者抽象某些有限資源等,能讓類(lèi)具有類(lèi)似數(shù)組的行為當(dāng)然也是非常有用的。本文就會(huì)引領(lǐng)你設(shè)置類(lèi)來(lái)采用索引器。但是,首先讓我們概述下屬性這個(gè)概念以便了解些必要的背景知識(shí)。
屬性
假如你曾經(jīng)用VB6編寫(xiě)過(guò)程序,那么你應(yīng)該很熟悉屬性方法才對(duì),所謂屬性方法其實(shí)就是特殊的類(lèi)成員,它實(shí)現(xiàn)了對(duì)私有類(lèi)域的受控訪問(wèn)。在C#語(yǔ)言中有兩種屬性方法,其一是get,通過(guò)它可以返回私有域的值,其二是set,通過(guò)它就可以設(shè)置私有域的值。比如說(shuō),以下面的代碼為例,其間創(chuàng)建了一個(gè)FirstName屬性,由它控制對(duì)私有類(lèi)成員firstname的訪問(wèn):
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);
如你你所看到的那樣,屬性聲明倒更像是域聲明,只不過(guò)它還聲明了兩個(gè)特殊的成員,按照微軟的說(shuō)法就是所謂的訪問(wèn)函數(shù)(accessor)。當(dāng)某一表達(dá)式的右邊調(diào)用屬性或者屬性用作其他子程序(或者函數(shù))的參數(shù)時(shí)即會(huì)調(diào)用get訪問(wèn)函數(shù)。反之,當(dāng)表達(dá)式左邊調(diào)用屬性并且通過(guò)隱式傳遞value參數(shù)設(shè)置私有域值的情況下就會(huì)調(diào)用set訪問(wèn)函數(shù)。你可以創(chuàng)建只讀屬性,方法是省略set訪問(wèn)函數(shù),這樣任何設(shè)置屬性的嘗試都會(huì)產(chǎn)生編譯錯(cuò)誤。
采用索引器的益處
說(shuō)了半天咱們轉(zhuǎn)到正題上來(lái),那么為什么我要兜這個(gè)圈子呢?其實(shí),這是因?yàn)轭?lèi)的索引器非常像屬性,從代碼上看也是這樣。以下是具有索引器的類(lèi)示例,通過(guò)索引器會(huì)返回一個(gè)字符串:
class Sample {
public string this [int index] {
get {return "You passed " + index; }
}
}
注意,這里的屬性名是this,意思是回引類(lèi)的當(dāng)前實(shí)例,參數(shù)列表包含在方括號(hào)而非括號(hào)之內(nèi)。還有,這是一個(gè)只讀索引器。為了把它改成讀/寫(xiě)類(lèi)型,我又添加了一個(gè)set訪問(wèn)函數(shù)。在定義索引器的時(shí)候,你不一定只采用一個(gè)參數(shù)。索引器參數(shù)可以采用任何類(lèi)型,不過(guò)int是通常采用也是最為合理的類(lèi)型。同一類(lèi)中還可能擁有一個(gè)以上的索引器(重載)。
如上定義了Sample類(lèi)之后,我們就可以把索引器用作某種默認(rèn)的屬性,如下所示:
Sample s = new Sample();
Console.WriteLine(s[55]);
屬性和索引器
屬性和索引器之間有好些差別:
類(lèi)的每一個(gè)屬性都必須擁有唯一的名稱,而類(lèi)里定義的每一個(gè)索引器都必須擁有唯一的簽名(signature)或者參數(shù)列表(這樣就可以實(shí)現(xiàn)索引器重載)。
屬性可以是static(靜態(tài)的)而索引器則必須是實(shí)例成員。
為索引器定義的訪問(wèn)函數(shù)可以訪問(wèn)傳遞給索引器的參數(shù),而屬性訪問(wèn)函數(shù)則沒(méi)有參數(shù)。
接口
類(lèi)似數(shù)組的行為常受到程序?qū)崿F(xiàn)者的喜愛(ài),所以你還可以為接口定義索引器,IList和 IDictionary集合接口都聲明了索引器以便訪問(wèn)其存儲(chǔ)的項(xiàng)目。
在為接口聲明索引器的時(shí)候,記住聲明只是表示索引器的存在。你只需要提供恰當(dāng)?shù)脑L問(wèn)函數(shù)即可,不必包括范圍修飾符。以下代碼把索引器聲明為接口IImplementMe的一部分:
interface IImplementMe {
string this[int index]
{
get;
set;
}
相應(yīng)實(shí)現(xiàn)的類(lèi)則必須為IimplementMe的索引器具體定義get和set訪問(wèn)函數(shù)。
以上就是有關(guān)索引器的一些基本概述了。現(xiàn)在你應(yīng)該對(duì)索引器在你的開(kāi)發(fā)中所具有的作用有了較深入的了解。
索引器允許類(lèi)或結(jié)構(gòu)的實(shí)例按照與數(shù)組相同的方式進(jìn)行索引。索引器類(lèi)似于屬性,不同之處在于它們的訪問(wèn)器采用參數(shù)。
在下面的示例中,定義了一個(gè)泛型類(lèi),并為其提供了簡(jiǎn)單的 get 和 set 訪問(wèn)器方法(作為分配和檢索值的方法)。Program 類(lèi)為存儲(chǔ)字符串創(chuàng)建了此類(lèi)的一個(gè)實(shí)例。
class SampleCollection<T>
{
??? 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<string> stringCollection = new SampleCollection<string>();
??????? stringCollection[0] = "Hello, World";
??????? System.Console.WriteLine(stringCollection[0]);
轉(zhuǎn)載于:https://www.cnblogs.com/wangdetian168/archive/2009/03/20/suoyinqi.html
總結(jié)
以上是生活随笔為你收集整理的c#索引器介绍|C#索引器写法|c#索引器例子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 读取Excel表格数据到DataGrid
- 下一篇: GAE Python 2009-3-22