C#索引器的优点是什么?

做了一些代码阅读,并偶然发现了我之前从未见过的片段:

public SomeClass { public someInterface this[String strParameter] { get { return SomeInternalMethod(strParameter); } } } 

它看起来像是如下调用:

 SomeClass _someClass = new SomeClass(); SomeInterface returnedValue = _someClass["someString"]; 

我感兴趣的是这个函数适合的位置或者这种风格的写作意图。 例如,为什么这比仅仅调用函数更受欢迎?

请参阅语言规范,第10.9节,其中规定:

Indexer是一个成员,它使对象的索引方式与数组相同。

索引器和属性在概念上非常相似,但在以下方面有所不同:

  • 属性由其名称标识,而索引器由其签名标识。
  • 通过简单名称(第7.5.2节)或成员访问(第7.5.4节)访问属性,而通过元素访问(第7.5.6.2节)访问索引器元素。
  • 属性可以是静态成员,而索引器始终是实例成员。
  • 属性的get访问器对应于没有参数的方法,而索引器的get访问器对应于具有与索引器相同的forms参数列表的方法。
  • 属性的set访问器对应于具有名为value的单个参数的方法,而索引器的set访问器对应于具有与索引器相同的forms参数列表的方法,以及名为value的附加参数。
  • 索引器访问器声明与索引器参数同名的局部变量是编译时错误。
  • 在重写属性声明中,使用语法base.P访问inheritance的属性,其中P是属性名称。 在重写索引器声明中,使用语法base [E]访问inheritance的索引器,其中E是以逗号分隔的表达式列表。

似乎很多答案都集中在索引器上,而不是为什么要使用索引器。

就我而言,这是使用索引器的动机:

您正在处理具有某种类型集合的类,但您希望该类对用户(类的使用者)显示,就像它一个集合一样。

我能想到的最好的例子是ADO.NET中的DataRow类。 如果要获取DataRow的第五个单元格的值,可以使用DataRow.Item[4]DataRow[4] 。 后一种forms是一种方便和逻辑的快捷方式,它很好地展示了为什么你想要使用索引器。 对于用户来说, DataRow可以被认为只是一个单元集合(即使它真的不止于此),因此能够直接获取和设置单元格值是有意义的,而不必记住您实际上是获取/设置Item

希望有所帮助。

在许多情况下,’index’语法很有意义。 如果SomeClass代表某种集合,它特别有用。

它允许您进行关联数组查找(也称为“字典样式”),就像您在问题中提到的那样。

这就是重点。 有些人喜欢这样,特别是来自内置语言的人,比如Python或PHP

“this”关键字是一个索引器

来自http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx

“索引器允许类或结构的实例像数组一样被索引。索引器类似于属性,除了它们的访问器接受参数。”

您之前可能已经偶然发现了类似的事情:

 var myList = new List(); myList.Add("One"); myList.Add("Two"); myList.Add("Three"); for(int i = 0; i < myList.Count; i++) { string s = myList[i]; } 

索引器是实现集合的对象的“主键”。 它只是编写像.GetValue(索引)这样的函数的简写方法 - 如果你愿意的话,可以用语法糖。 但它也使意图明确。

它是索引operator [ ]一个实现。

这是一个操作员超载。 如果您正在编写集合类,例如使用数组表示法访问它,例如集合[someIndex],则非常有用。

你当然可以写一个collection.GetElement(someIndex)函数等价,但它是一个样式/可读性的东西。

那么你可以在键值对类中使用这个方法。

我不确定c#中的类似类是什么,但在c ++ STL中,有一个map类,你用SomeObject["key"]调用该方法,它将返回与该键相关的“value”。

这称为索引器,它们允许您使用数组语法使用List <>,ArrayList,Dictionary <>和所有其他集合。

它只是语法糖,但它在正确使用时提供了一些可读性。

在我看来,这只是一种语法方便。 你不会在哪里使用它:

 public SomeClass { private int[] nums; public GetVal this[int ind] { get { return nums[ind]; // this is pointless since array is already indexed } } } 

你会从哪里受益

 public Matrix { private Dictionary matrixData; // Matrix indecies, value public double this[int row, int col] { get { return matrixData[string.Format("{0},{1}", row, col)]; } } } 

正如您所看到的,由于某种原因,您的数据是一个使用字符串键索引的字典,并且您希望使用两个整数forms来调用它,但仍然不想更改您的数据类型:

 Matrix m = new Matrix(); ... Console.WriteLine( m[1,2] );