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

Mic*_*uso 13 c# methods indexer

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

public SomeClass {
  public someInterface this[String strParameter] {
    get {
      return SomeInternalMethod(strParameter);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它看起来像是如下调用:

SomeClass _someClass = new SomeClass();
SomeInterface returnedValue = _someClass["someString"];
Run Code Online (Sandbox Code Playgroud)

我感兴趣的是这个函数适合的地方或者这种风格的写作意图.例如,为什么这比简单地调用函数更受欢迎?

Eri*_*ert 22

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

一个分度器是使得以相同的方式作为数组要索引的对象的构件.

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

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

  • 我刚检查了设计说明档案,没有任何证据表明没有静态索引器的决定.因此,我必须回到我通常的解释,为什么我们没有一个功能:没有人认为花钱赚钱是一个很好的想法.我想这个相同的解释也解释了为什么索引器不能是通用的. (3认同)
  • 我知道我不应该劫持这个,但也许你可以写博客,说明为什么没有静态索引器?当我看到它们不存在时,我感到很震惊,因为它是一种非常好的,简洁的方式.(在Jon之前提出好的编码["UTF8"]示例:)) (2认同)

dev*_*xer 18

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

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

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

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

希望有所帮助.


Eri*_*ich 6

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