C#中的"this[0]"是什么意思?

59

我正在查看一些库代码,看到了一个像这样的方法:

public CollapsingRecordNodeItemList List
{
    get { return this[0] as CollapsingRecordNodeItemList; }
}

包含这个方法的类不是一个列表或可迭代对象,所以 this[0] 到底代表什么意思?


15
这个类拥有一个索引器。 - Paolo Falabella
10
这个类重载了索引运算符[]吗? - Nick
1
@Cemre 请查看是否有 this[int index]this[long index] 或类似的东西...你不能将整数 (0) 作为 string name 传递进去。 - Marc Gravell
2
@Cemre,那只是另一个索引器。父类使用“string”类型进行索引。 - Jodrell
2
这里有一条额外的信息,可能会帮助到未来的读者。索引器最初是在抽象类Collectionbase中引入的。后来,这个特性也成为了List<T>的一部分。 - developer747
显示剩余4条评论
4个回答

96

在类中查找索引器

C#允许您定义索引器以允许这种类型的访问。

以下是“SampleCollection”官方指南中的示例。

public T this[int i]
    {
        get
        {
            // This indexer is very simple, and just returns or sets 
            // the corresponding element from the internal array. 
            return arr[i];
        }
        set
        {
            arr[i] = value;
        }
    }

这里是来自官方语言规范的定义:

索引器是一种成员,使对象可以像数组一样进行索引。索引器的声明方式与属性类似,只不过成员的名称为“this”,后跟在方括号[和]之间编写的参数列表。这些参数可以在索引器的访问器中使用。与属性类似,索引器可以是读写、只读或只写,并且索引器的访问器可以是虚拟的。

完整的定义可以在规范的第10.9节“索引器”中找到。

我在其中一个父类中发现了一个属性,但索引是string而不是intpublic GoObject this[string name] { get; set; }。我猜想还有另一个地方也有这样的属性。 - Cemre Mengü
4
@Cemre 语言规范说明(第1.6.7.3节):“索引器可以被重载,这意味着一个类可以声明多个索引器,只要它们的参数数量或类型不同即可。” :) 可能在这种情况下就是这样的。 - Benjamin Gruenbaum
1
谢谢您的评论。刚刚发现另一个是:public virtual GoObject this[int index] { get; set; } :) - Cemre Mengü

10

这意味着声明类型(或其基类)具有“索引器”,该索引器可能需要一个int(或类似类型)并返回...某些内容(也许是object?)。 代码调用索引器的get访问器,将0作为索引传递 - 然后将返回的值视为CollapsingRecordNodeItemList(如果返回的值与此不兼容,则为null)。

例如:

public object this[int index] {
    get { return someOtherList[index]; }
}

最简单的方法就是踏进去,这会让你准确地知道它将去往何方。


2
假设该类本身从某种形式的 IList/IList<T> 继承,它只返回(并转换)集合中的第一个元素。
public class BarCollection : System.Collections.CollectionBase
{
    public Bar FirstItem
    {
        get { return this[0] as Bar; }
    }

    #region Coming From CollectionBase
    public Object this[ int index ]  {
        get { return this.InnerList[index]; }
        set { this.InnerList[index] = value; }
    }
    #endregion
}

4
IEnumerable 没有定义索引器,我猜您的意思是 IList<T> - Jodrell
2
确实,我还在喝咖啡醒神并工作。;-) 发现得好,谢谢你。 - Brad Christie

1
这意味着在该类上调用“item”属性的“get”方法。它被称为该类的索引器

索引器允许对类或结构的实例进行索引,就像数组一样。索引器类似于属性,只是它们的访问器接受参数。


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