C#索引器的实际用例是什么?

49

我已经看到了很多C#索引器的例子,但是它在现实生活中有什么用途呢?

我知道如果这不是一个重要的特性,C#大师就不会添加它,但是我想不出一个实际应用场景(不是那些虚构的东西)来使用索引器。

注意:我意识到相关问题存在,但它并没有对我有太大的帮助。


除了列表类型、链表类型、字典类型或其他集合外,还有哪些?;) 当你有一系列东西时,通常会考虑提供一个索引器,这样就可以使用myList[k]而不是myList.Get(k)或VB版本的myList.Item(k)。 - Skurmedel
@Skurmedel 请解释一下,我显然漏掉了什么。 - Vivek Bernard
所以我有一个包含字段“col”的类,它是一个集合,当我需要访问“col”中的特定值时,那就是我将使用索引器的时候。 - Vivek Bernard
6
如果你的类模拟存储某种数据或包含需要检索的单独数据,那么使用索引器可能很有用。字符串具有索引器,所以可以使用str[1]来检索第二个字符。FontStorage[key]可能有意义,而Font[key]可能没有意义。通常存储数据的方式并不重要,但接口(外观/表示)决定了是否需要一个索引器。话虽如此,我很少使用它们,但有时它们很方便。我制作了一个ASP.NET Cache包装器,在那里Cache["key"]是有意义的,这是一个现实世界的场景 ;) - Skurmedel
1
不要忘记 DataSet 和 DataTable 和 DataColumn 和 DataRow。它们都使用索引器! - Muad'Dib
显示剩余2条评论
14个回答

1
这是我创建的视频http://www.youtube.com/watch?v=HdtEQqu0yOY,以下是有关该视频的详细说明。
索引器可以使用简化的接口访问类中包含的集合。它是语法糖。
例如,假设您有一个客户类,其中包含地址集合。现在假设我们想通过“Pincode”和“PhoneNumber”获取地址集合。那么逻辑步骤就是您将去创建两个重载函数,一个使用“PhoneNumber”获取,另一个使用“PinCode”获取。您可以在下面的代码中看到我们定义了两个函数。
Customer Customers = new Customer();
Customers.getAddress(1001);
Customers.getAddress("9090");

如果您使用索引器,可以通过以下代码简化上面的代码。
Customer Customers = new Customer();
Address o = Customers[10001];
o = Customers["4320948"];

干杯。


1
我认为这个例子并不是很好,原因如下:索引器应该具有数组的语义,所以期望Customers[1001]返回一个Customer而不是像Address这样的其他类型。在您的情况下,最好使用getAddress来传达正确的意图。否则,我会将实现索引器的类命名为Addresses,然后获取Address作为Addresses[1001]。 - Sudhanshu Mishra

0

http://code-kings.blogspot.in/2012/09/indexers-in-c-5.html

使用 System;

命名空间 Indexers_Example

{

class Indexers
{

    private Int16[] RollNumberVariable;

    public Indexers(Int16 size)
    {
        RollNumberVariable = new Int16[size];

        for (int i = 0; i < size; i++)
        {
            RollNumberVariable[i] = 0;
        }
    }

    public Int16 this[int pos]
    {
        get
        {
            return RollNumberVariable[pos];
        }
        set
        {
            RollNumberVariable[pos] = value;
        }
    }
}

}


0

我正在尝试从一个序列文件中获取图像。我需要一种二维数组或锯齿数组来保存像素值。我使用索引器而不是数组,因为循环索引器比循环二维或锯齿数组更快。


0

针对 @code-kings 的帖子的补充。

此外,调用 RollNumberVariable[0] 将触发默认集合索引器的行为。尽管索引器实际上是属性,但在提取数据时编写自己的逻辑是你的职责。您可以轻松地将大多数索引参数值委托给内部集合,但也可以为某些索引值返回任意值。

举个例子 - 您可以拥有两个不同格式的内部集合,但外部用户将通过单个索引器与它们交互(这将类似于分配器),而这些集合将被隐藏。这基本上鼓励了封装原则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接