【问题标题】:C# class Indexer usesC# 类索引器使用
【发布时间】:2018-03-09 06:10:18
【问题描述】:

C# Indexers 的文档中,它指出:

索引器是一种语法便利,使您能够创建客户端应用程序可以像数组一样访问的类、结构或接口。索引器最常在类型中实现,其主要目的是封装内部集合或数组。

我只见过它们与这个单一用例相关联。
其他明显的用例是什么?

【问题讨论】:

  • @ilansch 是的,这是引用引用的单个用例,其他的是什么?因为它说它是最频繁的,所以显然有超过 1 个?
  • 我想不出一个索引器被 MS 使用的例子,它与集合、数组或某种列表无关。虽然我曾经虐待过他们一两次
  • 您可能会或可能不会返回不同的类型(例如float thisdouble this),返回枚举的索引或根据您的index 计算某些东西...

标签: c#


【解决方案1】:

您可以获得索引属性的完整列表,以及用于索引它们的键的名称,代码如下:

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) 中有一个私有类,它接受多个替代“键”(例如 XmlDataReader 或 DataTable),它们不充当键,但用于填充键(例如,通过将一些属性复制到不同的对象中,然后将其用作索引器键)。但是该属性仍然命名为Item[],整体概念是包含一个集合,实际上,该类继承自HashTable

(顺便说一句,XmlToDataSetMap 还包含另一个私有类 XmlNodeIdentety,它的名称包含我在 CLR 中见过的唯一明显的拼写错误。所以也许我们不想效仿写这门课的人。)

【讨论】:

  • 哈哈,错字太棒了。很有趣的用户案例,谢谢分享!
【解决方案2】:

理论上你可以用索引器做任何事情,你也可以用函数做。但是作为索引器“光学模拟”数组,将它们用于不“类似数组”的东西是不好的风格。

我认为重点是“内部收集”。想象一下(作为一个非常糟糕的例子)一个平方数的数组(例如 a[0]=0; a[1]=1; a[2]=4;)。您也可以通过索引器访问相同的“数组”,而无需保存任何内部集合。

虽然这个案例很愚蠢,但可能还有更合理的案例。

例如,如果之前不清楚是出于性能原因预先分配数组还是动态计算数组元素更好。在这里,您可以使用相同的语法获得两种行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-21
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2011-02-24
    相关资源
    最近更新 更多