c# - 为什么类中的索引器属性需要一个私有(private)数组字段而不仅仅是一个告诉对象其索引的整数?

标签 c# arrays indexing

我认为索引器的意义在于,如果你在类似 winform 的东西中有一个数组或某个类的列表,你可以通过键入 myObject[index].SomeMethod();

为什么 C# 中关于索引器的示例需要类具有数组的私有(private)字段,然后公共(public)索引器属性从该私有(private)数组中获取索引?只保存一个告诉它它的索引是什么的整数不是更好吗?有什么区别?

最佳答案

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

仅包含索引的整数不会告诉类它应该使用该索引检索什么对象,特别是如果该类本身不是一个集合(但即使是一个集合类型也可能是这种情况,取决于它执行)。例如,如果 myObjectMyClass 的一个实例,而 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/

相关文章:

postgresql - 通过在 postgresql 上索引时间戳列来加快搜索速度?

regex - 使用正则表达式和排序的 Mongodb 简单前缀查询很慢

C# 资源字典 XamlParseException - 线程安全?

c# - 货币符号未显示在控制台窗口中

c# - .NET DateTime,与 OADate 转换时的分辨率不同?

javascript - 增加字符串中的 X

ruby-on-rails - 在保存/验证之前创建一个数组

c# - 变量声明后的括号

arrays - 如何创建 5 个值的数组/slice ,所有值都相同

c++ - 查询 std::binary_search()