所谓索引器就是一类特殊的属性,通过它们你就可以像引用数组一样引用自己的类。索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。
索引器和属性有点类似,但却存在着差别如
- 属性在类中必须拥有唯一名称,而类中定义的索引器都必须拥有唯一的签名(signature)或者参数列表(索引器重载的实现)。
- 属性可以定义为static的,但是索引器去必须在实例化后在可以使用
- 为索引器定义的访问函数可以访问传递给索引器的参数,而属性访问函数则没有参数。
索引器结构:
<modifier> <return type> this [argument list] ...{ get ...{ // Get codes goes here } set ...{ // Set codes goes here } }
注:
modifier:修饰词,如private, public, protected or internal
this:在C#中this是一个特殊的关键字,它表示引用类的当前实例。在这里它的意思是当前类的索引。
argument list:这里指索引器的参数。
class Sample { public string indexValue; public string this[int index] { get { return string.Format("返回的索引号是:{0}", index); } set { indexValue = value; } } }
当然除了类中可以定义索引器外,接口也是可以的,如IList和 IDictionary集合接口都声明了索引器以便访问其存储的项目
在为接口声明索引器的时候,记住声明只是表示索引器的存在。你只需要提供恰当的访问函数即可,不必包括范围修饰符。以下代码把索引器声明为接口ISample的一部分:
interface ISample { string this[int index] { get; set; }
相应实现的类则必须为ISample(继承的接口)的索引器具体定义get和set访问函数。
class SampleCollection<T> { private T[] arr = new T[100]; public T this[int i] { get { return arr[i]; } set { arr[i] = value; } } }