我认为索引器的意义在于,如果你在类似 winform 的东西中有一个数组或某个类的列表,你可以通过键入 myObject[index].SomeMethod();
为什么 C# 中关于索引器的示例需要类具有数组的私有(private)字段,然后公共(public)索引器属性从该私有(private)数组中获取索引?只保存一个告诉它它的索引是什么的整数不是更好吗?有什么区别?
最佳答案
类需要确切地知道索引引用的是什么。
仅包含索引的整数不会告诉类它应该使用该索引检索什么对象,特别是如果该类本身不是一个集合(但即使是一个集合类型也可能是这种情况,取决于它执行)。例如,如果 myObject
是 MyClass
的一个实例,而 MyClass
不是一个集合,那么 myObject[index]
指的是?调用代码需要知道这一点(因为它需要一个包含 SomeMethod()
方法的返回类型),但只有 MyClass
可以准确地告诉调用代码它的索引器是如何工作的因为索引器是其类定义的一部分。
简而言之,将索引器视为接口(interface)——实际上,you can declare an indexer on an interface :
public interface IFooList
{
Foo this[int i] { get; set; }
}
— 以及底层集合作为实现。
您不需要私有(private)数组字段 — 例如,您可以轻松地使用已经公开的集合作为自动实现的公共(public)属性(尽管从现在开始这通常是不好的做法您有两种可能不同的方法来访问该集合,而不仅仅是一种):
public IList<Foo> FooList { get; } = new List<Foo>();
public Foo this[int i]
{
get { return FooList[i]; }
set { FooList[i] = value; }
}
您甚至可以使用不完全是集合的东西,并在索引器定义中为索引编写自定义逻辑。但重点是索引器需要确切地知道要查找的内容。
关于c# - 为什么类中的索引器属性需要一个私有(private)数组字段而不仅仅是一个告诉对象其索引的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40012185/