3

当我们必须使用Indexers而不是Fields在 C# 类中使用时,有人可以用一些真实的例子来澄清吗?

public class GradeHolder
{
    private int[] counts = new int[100];

    public int this[int grade]
    {
        get { return this.counts[grade];}
        set { this.counts[grade] = value; }
    }
}

public class GradeHolder
{
    private int[] counts = new int[100];

    public void SetCount(int index, int grade)
    {
        counts[index] = grade;
    }

    public int GetCount(int index)
    {
        return counts[index];
    }
}
4

3 回答 3

6

您永远不必使用索引器。

当数据结构是自然索引的数据结构时,它们很方便。

而且与字段的比较非常具有误导性——它们是不同的东西,不能真正直接比较(而不是何时使用一个而不是另一个)。

索引器只是一种使用某种索引访问该类型的某些元素的方法。字段是您用来保存类型状态的内容(包括您将索引的内容,如果有的话)。

您也可以在同一个类中使用两者:

public class GradeHolder
{
    private int[] counts = new int[100];

    public int[] Counts 
    { 
       get { return this.counts; }
       set { this.counts = value; }

    public int this[int grade]
    {
        get { return this.counts[grade];}
        set { this.counts[grade] = value; }
    }
}

索引器将返回列表中指定索引处的单个项目。

我已经用Get/Set属性替换了方法,这是更惯用的 C#(用于简单属性)。


更新:

既然您已经将Get/Set方法更改为更接近索引器所做的事情,那么对于两者中的哪一个更喜欢的答案当然是索引器。

为什么?

  • 因为你只有 1 个参数,而不是两个。
  • 因为索引器被其他程序员很好地理解并且是人们所期望的(最小惊讶原则)。
  • 因为它更地道。
于 2013-04-10T19:07:13.873 回答
1

当您希望您的类表现得像一个集合(或更可能是封装一个)时,根据某种索引处理不同的值。它是语法糖,真的。

于 2013-04-10T19:08:27.847 回答
1

更新:此答案适用于该问题的先前版本。

在您的第二个实现中,调用者可以(必须)完全替换 counts 字段,包括将其设置为 null 或更改其大小。

第一个实现保护计数字段,只允许访问每个元素。它还允许实现从 int[] 更改为以后的任何其他内容。

于 2013-04-10T19:19:09.157 回答