为什么类中的索引器属性需要私有数组字段而不只是一个整数告诉对象它的索引?

Mic*_*ton 1 c# arrays indexing

我认为索引器的意思是,如果你有某个类的数组或列表类似于winform,你可以通过输入myObject [index]来获取对象的索引.SomeMethod();

为什么C#中的索引器的示例需要一个类具有数组的私有字段,然后公共索引器属性从该私有数组获取索引?仅仅持有一个告诉它索引是什么的整数不是更好吗?有什么不同?

Bol*_*ock 5

该类需要确切地知道索引引用的内容.

仅包含索引的整数不会告诉该类应该使用该索引检索哪个对象,特别是如果该类本身不是一个集合(但即使是根据其实现的集合类型也是如此).例如,if myObject是一个实例MyClassMyClass不是一个集合,究竟是myObject[index]指什么?调用代码需要知道这一点(因为它需要一个包含SomeMethod()方法的返回类型),但只能MyClass告诉调用代码它的索引器是如何工作的,因为索引器是它的类定义的一部分.

简而言之,将索引器视为接口 - 实际上,您可以在接口上声明索引器:

public interface IFooList
{
    Foo this[int i] { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

- 和底层集合作为实现.

您不需要私有数组字段 - 例如,您可以轻松地使用已作为自动实现的公共属性公开的集合(尽管这通常是不好的做法,因为现在您有两种可能不同的方法来访问该集合而不只是一个):

public IList<Foo> FooList { get; } = new List<Foo>();

public Foo this[int i]
{
    get { return FooList[i]; }
    set { FooList[i] = value; }
}
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用完全不是集合的东西,并在索引器定义中为索引编写自定义逻辑.但重点是索引器需要确切知道要查找的内容.