在C# Indexers的文档中,它指出:
索引器是一种语法上的便利,使您能够创建客户端应用程序可以像数组一样访问的类,结构或接口。索引器最常实现类型,其主要目的是封装内部集合或数组。
我只看到过与这个单一用例相关的问题。
其他明显的用例是什么?
答案 0 :(得分:2)
您可以获得索引属性的完整列表,以及用于索引它们的键的名称,代码如下:
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"的索引参数。或"键。"所以它似乎确实是大多数用例。
在一些非常罕见的情况下,您会看到一些其他用途。例如,XmlToDataSetMap
(source)中有一个私人类可以接受多个替代"密钥" (例如,XmlDataReader,或DataTable),它不作为键,但用于填充键(例如,通过将某些属性复制到另一个对象中,然后将其用作索引键)。但是该属性仍然被命名为Item[]
,并且整体概念是包含集合的概念,实际上,该类继承自HashTable
。
(旁注,XmlToDataSetMap
还包含另一个私人课程XmlNodeIdentety
,其名称包含我在CLR中见过的唯一明显的拼写错误。所以也许我们不会&#39 ; t想要效法谁写这个班的例子。)
答案 1 :(得分:0)
理论上,您可以使用索引器执行所有操作,也可以使用函数。但随着索引器的光学模拟'对于那些不像数组类似的东西来说,使用它们是不好的风格。
我认为重点是内部收集'。想象(作为非常糟糕的例子)具有平方数的数组(例如a [0] = 0; a [1] = 1; a [2] = 4;)。您也可以访问相同的数组'没有任何内部收藏的索引者。
虽然这个案子非常愚蠢,但可能会有更合理的案例。
例如,如果先前不清楚是出于性能原因预先分配数组还是动态计算数组元素。在这里,您可以使用相同的语法获得这两种行为。