索引属性
某些类型如SystemCollectionsSortedList暴露逻辑元素列表为了能轻松存取这种类型中的元素可以定义一个索引属性(也叫索引器indexer)一个索引属性的例子其索引器的的使用极其简单
BitArray ba = new BitArray();
for (int x = ; x < ; x++) {
// 置所有偶数位为on
ba[x] = (x % == );
ConsoleWriteLine(Bit + x + is + (ba[x] ? On : Off));
}
BitArray例子中索引器带一个Int参数bitPosition索引器必须至少带一个参数参数个数可以是两个或更多这些参数(以及返回类型)可以是任何类型创建以String作为参数的索引器查找联合数组中的值是十分普通的事情一种类型可以提供多个索引器只要其原型不同
就像set属性set索引器存取方法包含一个隐藏的参数值当存取方法被调用时它表示想得到一个新的值BitArray的set存取方法显示了这个参数值的使用
一个设计良好的索引器应该具备get和set两个存取方法即便你能只实现get存取方法(对于只读语义)或者只实现set存取方法(对于只写语义)建议你的索引器实现两个存取器理由很简单索引的使用者不希望只有半个行为例如当编写下面两行代码时使用者不想看到编译器出错
String s = SomeObj[]; // 如果有存取器编译 OK
SomeObj[] = s; //如果没有存取器编译出错
索引器总是起类型实例的作用并且不能被声明为静态但它可以是公共的私有的保护的或内部的
当你创建索引属性时编译器实际上会发布专门的get_Item和/或set_Item存取器方法大多数编译器都会理解这些专门的方法并且会允许开发人员利用专门的索引属性语法存取这些方法但是与CLS(公共语言系统)兼容的编译器不需要完全支持索引属性只要编译器支持专用存取器调用即可
同样对于完全支持索引属性的编译器在定义和使用这些属性的时候需要的语法稍有差别例如C++受管扩展需要使用_property关键字
结论
本文中所讨论的概念对于所有NET的程序员来说极其重要我所提到的特殊的类型成员使组件成为公共语言运行时最重要的内容也就是说现代组件被设计成支持属性
[] [] []