为什么类中的indexer属性需要一个私有数组字段,而不仅仅是一个告诉对象其索引的整数

本文关键字:一个 不仅仅是 对象 整数 索引 字段 数组 indexer 为什么 属性 | 更新日期: 2023-09-27 18:12:46

我认为索引器的意义在于,如果你在winform中有一个特定类的数组或列表,你可以通过输入myObject[index]. someemethod ();

为什么c#中索引器的例子需要一个类有一个数组的私有字段,然后公共索引器属性从私有数组中获取索引?持有一个整数告诉它它的索引是多少不是更好吗?有什么区别?

为什么类中的indexer属性需要一个私有数组字段,而不仅仅是一个告诉对象其索引的整数

类需要确切知道索引引用的是什么。

仅包含索引的整数并不能告诉类它应该使用该索引检索什么对象,特别是如果该类本身不是集合(但即使是集合类型也可能是这种情况,这取决于其实现)。例如,如果myObjectMyClass的一个实例,而MyClass不是一个集合,那么myObject[index]究竟指的是什么?调用代码需要知道这一点(因为它期望返回类型包含SomeMethod()方法),但是只有MyClass可以告诉调用代码它的索引器是如何工作的,因为索引器是它的类定义的一部分。

简而言之,将索引器视为接口——实际上,您可以在接口上声明索引器:
public interface IFooList
{
    Foo this[int i] { get; set; }
}

-和底层集合作为实现。

你不需要一个私有数组字段——你可以很容易地使用一个已经被公开的集合作为一个自动实现的公共属性,例如(尽管这通常是不好的做法,因为现在你有两个潜在的不同的方法来访问集合,而不是只有一个):

public IList<Foo> FooList { get; } = new List<Foo>();
public Foo this[int i]
{
    get { return FooList[i]; }
    set { FooList[i] = value; }
}

您甚至可以使用不完全是集合的东西,并在索引器定义中为索引编写自定义逻辑。但关键是索引器需要确切地知道要查找什么

相关文章: