索引器概述
索引器使得对象可按照与数组相似的方法进行索引
get 访问器返回值set 访问器分配值
this 关键字用于定义索引器
value 关键字用于定义由 set 索引器分配的值
索引器不必根据整数值进行索引由您决定如何定义特定的查找机制
索引器可被重载
索引器可以有多个形参例如当访问二维数组时
C#语言一个最令人感兴趣的地方就是类的索引器(indexer)简单说来所谓索引器就是一类特殊的属性通过它们你就可以像引用数组一样引用 自己的类显然这一功能在创建集合类的场合特别有用而在其他某些情况下比如处理大型文件或者抽象某些有限资源等能让类具有类似数组的行为当然也是 非常有用的本文就会引领你设置类来采用索引器但是首先让我们概述下属性这个概念以便了解些必要的背景知识
属性
假如你曾经用VB编写过程序那么你应该很熟悉属性方法才对所谓属性方法其实就是特殊的类成员它实现了对私有类域的受控访问在C#语言 中有两种属性方法其一是get通过它可以返回私有域的值其二是set通过它就可以设置私有域的值比如说以下面的代码为例其间创建了一个 FirstName属性由它控制对私有类成员firstname的访问
class Person {
private string firstname;
public string FirstName {
get {return firstname;}
set {firstname = value;}
}
}
属性声明可以如下编码 Person p = new Person();
pFirstName = Lamont;
ConsoleWriteLine (pFirstName);
如你你所看到的那样属性声明倒更像是域声明只不过它还声明了两个特殊的成员按照微软的说法就是所谓的访问函数(accessor)当某 一表达式的右边调用属性或者属性用作其他子程序(或者函数)的参数时即会调用get访问函数反之当表达式左边调用属性并且通过隐式传递value参数 设置私有域值的情况下就会调用set访问函数你可以创建只读属性方法是省略set访问函数这样任何设置属性的尝试都会产生编译错误
采用索引器的益处
说了半天咱们转到正题上来那么为什么我要兜这个圈子呢?其实这是因为类的索引器非常像属性从代码上看也是这样以下是具有索引器的类示例通过索引器会返回一个字符串 class Sample {
public string this [int index] {
get {return You passed + index; }
}
}
注意这里的属性名是this意思是回引类的当前实例参数列表包含在方括号而非括号之内还有这是一个只读索引器为了把它改成读/写类 型我又添加了一个set访问函数在定义索引器的时候你不一定只采用一个参数索引器参数可以采用任何类型不过int是通常采用也是最为合理的类 型同一类中还可能拥有一个以上的索引器(重载)
如上定义了Sample类之后我们就可以把索引器用作某种默认的属性如下所示 Sample s = new Sample();
ConsoleWriteLine(s[]);
属性和索引器
属性和索引器之间有好些差别
类的每一个属性都必须拥有唯一的名称而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)
属性可以是static(静态的)而索引器则必须是实例成员
为索引器定义的访问函数可以访问传递给索引器的参数而属性访问函数则没有参数
接口
类似数组的行为常受到程序实现者的喜爱所以你还可以为接口定义索引器IList和 IDictionary集合接口都声明了索引器以便访问其存储的项目
在为接口声明索引器的时候记住声明只是表示索引器的存在你只需要提供恰当的访问函数即可不必包括范围修饰符以下代码把索引器声明为接口IImplementMe的一部分 interface IImplementMe {
string this[int index]
{
get;
set;
}
相应实现的类则必须为IimplementMe的索引器具体定义get和set访问函数
以上就是有关索引器的一些基本概述了现在你应该对索引器在你的开发中所具有的作用有了较深入的了解
索引器允许类或结构的实例按照与数组相同的方式进行索引索引器类似于属性不同之处在于它们的访问器采用参数
在下面的示例中定义了一个泛型类并为其提供了简单的 get 和 set 访问器方法(作为分配和检索值的方法)Program 类为存储字符串创建了此类的一个实例
class SampleCollection<T>
{
private T[] arr = new T[];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
// This class shows how client code uses the indexer
class Program
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[] = Hello World;
SystemConsoleWriteLine(stringCollection[]);
}
}