一、索引器的基本概述
索引器定义类似于属性,但其功能与属性并不相同,可以看成是属性的增强版,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写。
1、索引器的定义
定义的一般形式:
[修饰符] 数据类型this[索引类型 index]
{
get{//获得属性的代码}
set{ //设置属性的代码}
}
修饰符包括public,protected,private,internal,new,virtual,sealed,override, abstract,extern.
this关键字用于定义索引器。this表示操作本对象的数组或集合成员,可以简单把它理解成索引器的名字,因此索引器不能具有用户定义的名称。
数据类型是表示将要存取的数组或集合元素的类型。
索引类型表示该索引器使用哪一类型的索引来存取数组或集合元素,可以是整数,可以是字符串。
get访问器返回值。set访问器分配值。访问器的用途是指示索引器是可读写、只读还是只写的,如果是可读写的,访问器get或set均不能省略;如果只读的,省略set访问器;如果是只写的,省略get访问器。
value关键字用于定义由 set 索引器分配的值。
索引器可被重载。
索引器可以有多个形参,例如当访问二维数组时。
举例:相册索引
usingSystem;
namespace索引器
{
class Program
{
static void Main(string[] args)
{
//实例化相册
Ablum Myablum1 = new Ablum(2);
//实例化两张照片
Photo first = newPhoto("XiaoHong");
Photo second = newPhoto("XiaoMing");
//将两张照片赋给相册
Myablum1[0] = first;
Myablum1[1] = second;
//按序号查找
Photo testPhotos = Myablum1[0];
Console.WriteLine(testPhotos.Title);
//按标题查找
Photo testPhotos1 =Myablum1["XiaoMing"];
Console.WriteLine(testPhotos1.Title);
}
}
class Photo
{
private string PhotoTitle;
public Photo()
{
}
public Photo(string title)
{
PhotoTitle = title;
}
public string Title
{
get { return PhotoTitle; }
}
}
//相册类
class Ablum
{
//照片数组
private Photo[] photos;
//构造函数
public Ablum()
{
}
public Ablum(int Capacity)
{
photos = new Photo[Capacity];
}
//索引器的签名由其形参的数量和类型组成。它不包括索引器类型或形参名。
//如果在同一类中声明一个以上的索引器,则它们必须具有不同的签名。
//按序号索引
public Photo this[int index]
{
get {
if (index < 0 || index >=photos.Length)
{
Console.WriteLine("索引有问题");
return null;
}
return photos[index];
}
set {
if (index < 0 || index >=photos.Length)
{
Console.WriteLine("索引有问题");
return;
}
photos[index] = value;
}
}
//按标题索引
public Photo this[string title]
{
get {
foreach (Photo p in photos)
{
if (p.Title == title)
return p;
}
Console.WriteLine("找不到");
return null;
}
}
}
}
2、另外,在接口中也可以声明索引器,接口索引器与类索引器的区别有两个:一是接口索引器不使用修饰符;二是接口索引器只包含访问器get或set,没有实现语句。
例如:
publicinterface IAddress
{
stringthis[int index]{get;set;}
stringAddress{get;set;}
stringAnswer();
}
表示所声明的接口IAddress包含3个成员:一个索引器、一个属性和一个方法,其中,索引器是可读写的。
一般示例:
// Indexeron an interface:
publicinterface ISomeInterface
{
// Indexer declaration:
int this[int index]
{
get;
set;
}
}
//Implementing the interface.
classIndexerClass : ISomeInterface
{
private int[] arr = new int[100];
public int this[int index] // indexer declaration
{
get
{
// Check the index limits.
if (index < 0 || index >=100)
{
return 0;
}
else
{
return arr[index];
}
}
set
{
if (!(index < 0 || index >=100))
{
arr[index] = value;
}
}
}
}
classMainClass
{
static void Main()
{
IndexerClass test = new IndexerClass();
// Call the indexer to initialize theelements #2 and #5.
test[2] = 4;
test[5] = 32;
for (int i = 0; i <= 10; i++)
{
System.Console.WriteLine("Element #{0} = {1}", i, test[i]);
}
}
}
3、索引器和属性的区别
属性 | 索引器 |
允许调用方法,如同它们是公共数据成员。 | 允许调用对象上的方法,如同对象是一个数组。 |
可通过简单的名称进行访问。 | 可通过索引器进行访问。 |
可以为静态成员或实例成员。 | 必须为实例成员。 |
属性的 get访问器没有参数。 | 索引器的 get 访问器具有与索引器相同的形参表。 |
属性的 set 访问器包含隐式 value 参数。 | 除了 value 参数外,索引器的 set 访问器还具有与索引器相同的形参表。 |