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

C# 何时使用索引器而不是字段,c#,.net,C#,.net,当我们必须在C#类中使用索引器而不是字段时,有人能用一些真实的例子来澄清一下吗 您从来没有使用索引器 当数据结构是自然索引的结构时,它们很方便 与字段的比较是非常误导性的——它们是不同的东西,不能直接比较(不能在何时使用一个字段而不是另一个字段) 索引器只是使用某种索引访问类型的某些元素的一种方法。字段是用来保存类型状态的字段(如果有的话,包括要索引的内容) 您也可以在同一类中使用这两个选项: public class GradeHolder { private int[] counts

当我们必须在C#类中使用
索引器而不是
字段时,有人能用一些真实的例子来澄清一下吗


您从来没有使用索引器

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

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

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

您也可以在同一类中使用这两个选项:

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
方法更改为更接近索引器所做的操作,那么这两个方法中的哪一个更合适,答案当然是索引器

为什么?

  • 因为您只有一个参数,而不是两个
  • 因为索引器被其他程序员很好地理解,并且是人们所期望的()
  • 因为它更地道

当您希望类的行为类似于集合(或者更可能是封装集合)时,基于某种索引处理不同的值。这真是语法上的甜点。

更新:这个答案是针对这个问题的前一个版本

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


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

您能看看我刚才添加了一些示例的问题,并说一种方法是否优于另一种方法吗?@Peretz-您又在做两件不同的事情了。索引器返回传入索引中的单个计数。第二个类(使用Get/Set方法)返回完整的集合,可能应该使用属性来完成。@Peretz-在获得关于原始代码的答案后更改问题不是很好,并且会使给出的答案无效-即使在给出答案时不是这样。请,如果你发布了“不正确”的代码,至少要考虑改变事情,所以当前的答案仍然是有效的。
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; }
    }
}