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

解决方案 »

  1.   

    这里你提到indexer,那么你应该对properties比较熟悉了。首先确定的是indexer和properties使用的语法是一样的。具体的语法看帮助吧,非一言两语我能概括的。使用properties的好处在于,使用class(别人编写的)的程序员可以直接使用class.field的语法引用类的字段,而不需要知道这个字段是否可以访问,而且可以在为类字段赋值的时候,验证、计算等等。(或许还有其他好处)使用indexer的好处在于,使用class(别人编写的)的程序员对对象进行索引,就像对象本身在数组里面一样。如下代码:你可以体会indexer的好处:Mylistbox lbx = new Mylistbox();
    lbx[0]="aaa";
    lbx[1]="bbb";
    lbx[2]="bbb";而其内部的工作自然有indexer来完成。
      

  2.   

    我认为索引器应该是对class的简单属性获取。
    无论这个class是否为list都可以通过object this[int index]的模式去声明索引器
    我们可以通过index的值返回不同的object给使用者。
    我还没有试过返回不同的object比如1返回一个int,2返回一个string,有空了试试。。