做了一些代码阅读,并偶然发现了我之前从未见过的片段:
public SomeClass { public someInterface this[String strParameter] { get { return SomeInternalMethod(strParameter); } } }
它看起来像是如下调用:
SomeClass _someClass = new SomeClass(); SomeInterface returnedValue = _someClass["someString"];
我感兴趣的是这个函数适合的地方或者这种风格的写作意图.例如,为什么这比简单地调用函数更受欢迎?
请参阅语言规范,第10.9节,其中规定:
一个分度器是使得以相同的方式作为数组要索引的对象的构件.
索引器和属性在概念上非常相似,但在以下方面有所不同:
属性由其名称标识,而索引器由其签名标识.
通过简单名称(第7.5.2节)或成员访问(第7.5.4节)访问属性,而通过元素访问(第7.5.6.2节)访问索引器元素.
属性可以是静态成员,而索引器始终是实例成员.
属性的get访问器对应于没有参数的方法,而索引器的get访问器对应于具有与索引器相同的形式参数列表的方法.
属性的set访问器对应于具有名为value的单个参数的方法,而索引器的set访问器对应于具有与索引器相同的形式参数列表的方法,以及名为value的附加参数.
索引器访问器声明与索引器参数同名的局部变量是编译时错误.
在重写属性声明中,使用语法base.P访问继承的属性,其中P是属性名称.在重写索引器声明中,使用语法base [E]访问继承的索引器,其中E是逗号分隔的表达式列表.
似乎很多答案都集中在索引器上,而不是为什么要使用索引器.
就我而言,这是使用索引器的动机:
您正在处理具有某种集合的类,但您希望该类对用户(该类的使用者)显示,就像它是一个集合一样.
我能想到的最好的例子是DataRow
ADO.NET中的类.如果你想获得a的第五个单元格的值DataRow
,你可以使用DataRow.Item[4]
或DataRow[4]
.后一种形式是一种方便和逻辑的快捷方式,它很好地展示了为什么你想要使用索引器.对于用户来说,DataRow
可以将其视为一组单元格(即使它确实不止于此),因此能够直接获取和设置单元格值是有意义的,而不必记住您实际上正在获取/设置Item
.
希望有所帮助.
在许多情况下,'index'语法很有意义.如果SomeClass代表某种集合,它特别有用.