何时使用索引器而不是字段

3

有没有人可以用一些真实的例子来澄清我们在 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];
    }
}

1
阅读此链接:http://www.dotnetperls.com/indexer - KF2
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方法更改为更接近索引器的方式,那么您更喜欢哪个呢?当然是索引器。

为什么?

  • 因为它只有一个参数,而不是两个。
  • 因为其他程序员都很了解索引器,并且这是人们所期望的(最小惊奇原则)。
  • 因为它更符合习惯用法。

你能否看一下我刚刚添加的一些示例,并说一下哪种方法比另一种更好吗? - NoWar
@Peretz - 你又在做两件不同的事情。索引器返回传入索引中的单个 _count_。第二个类(带有 Get/Set 方法)返回完整的集合,应该使用属性来完成。 - Oded
1
@Peretz - 在得到有关原始代码的答案后更改问题并不好,这使得给出的答案无效 - 即使在给出时它们并不是如此。如果您发布“不正确”的代码,请至少考虑更改内容,以便当前的答案仍然有效。 - Oded

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

1

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

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

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


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