簡體   English   中英

C#類索引器使用

[英]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”的索引參數。 因此,似乎確實是大多數用例。

在極少數情況下,您會看到一些替代用途。 例如,在XmlToDataSetMapsource )中有一個私有類, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM