[英]C# class Indexer uses
在C#Indexers的文檔中,它指出:
索引器是一種語法上的便利,使您可以創建客戶端應用程序可以按數組訪問的類,結構或接口。 索引器最經常以其主要目的是封裝內部集合或數組的類型實現 。
我只見過它們與這個單一用例相關聯。
還有哪些其他明顯的用例?
您可以使用以下代碼獲取已索引屬性的完整列表,以及用於索引它們的鍵的名稱:
var list = System.AppDomain.CurrentDomain.GetAssemblies()
.SelectMany
(
a => a.GetTypes().SelectMany
(
t => t.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)
.Where
(
p => p.GetIndexParameters().Length > 0
)
.Select
(
prop => string.Format
(
"{0}.{1}[{2}]",
t.FullName,
prop.Name,
string.Join
(
",",
prop.GetIndexParameters().Select(ip => ip.Name)
)
)
)
)
);
如果您仔細查看列表,將會看到絕大多數具有名為“ index”或“ key”的索引參數。 因此,似乎確實是大多數用例。
在極少數情況下,您會看到一些替代用途。 例如,在XmlToDataSetMap
( source )中有一個私有類, XmlToDataSetMap
接受幾個替代的“鍵”(例如XmlDataReader或DataTable),這些“鍵”不用作鍵,但確實可以填充鍵(例如,通過復制將某些屬性添加到另一個對象中,然后將其用作索引器鍵)。 但是該屬性仍被命名為Item[]
,並且整個概念是其中一個包含集合的概念,的確,該類繼承自HashTable
。
(附帶說明, XmlToDataSetMap
還包含另一個私有類XmlNodeIdentety
,其名稱包含我在CLR中見過的唯一公然的拼寫錯誤。因此,也許我們不想遵循編寫此類的人的示例。)
從理論上講,您可以使用索引器完成所有操作,也可以使用函數進行操作。 但是當索引器“光學模擬”數組時,將其用於並非“類似數組”的東西將是不好的樣式。
我認為重點是“內部收藏”。 想象一下(作為一個非常糟糕的例子)一個具有平方數的數組(例如a [0] = 0; a [1] = 1; a [2] = 4;)。 您也可以通過索引器訪問相同的“數組”,而無需保存任何內部集合。
盡管這種情況非常愚蠢,但可能會有更合理的情況。
例如,如果以前尚不清楚,出於性能原因預分配數組還是動態計算數組元素更好。 在這里,您可以使用相同的語法獲得兩種行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.