索引器其实也是类的一种成员,它使得对象可以像数组一样被索引,当一个类包含数组或集合成员时,索引器将大大简化对数组或集合成员的存取操作
参数的个数和类型都是任意的。用reflector反编译可以看出,索引器的内部本质上就是set_item、get_item方法。
看下面的实例,先定义一个图书类
class Book
{
private string _title;
public Book(string title)
{
_title = title;
}
public string Title
{
get { return _title; }
}
}
再定义一个书架类,里面包含图书数组
class BookStack
{
Book[] books;
public BookStack(int size)
{
books = new Book[size];
}
//通过索引访问图书数组
public Book this[int index]
{
get
{
if (index < 0 || index >= books.Length)
{
return null;
}
return books[index];
}
set
{
if (index < 0 || index >= books.Length)
{
return;
}
books[index] = value;
}
}
//通过书名访问数组
public Book this[string title]
{
get
{
foreach (Book p in books)
{
if (p.Title == title)
{
return p;
}
}
return null;
}
}
}
主程序中调用
BookStack bookstack = new BookStack(3);
Book first = new Book("西游记");
Book second = new Book("水浒传");
Book third = new Book("三国寅义");
bookstack[0] = first;
bookstack[1] = second;
bookstack[2] = third;
Console.WriteLine(bookstack[2].Title); //三国寅义
Book newbook = bookstack["水浒传"];
Console.WriteLine(newbook.Title); //水浒传
Console.ReadKey();
索引器和属性进行比较
索引器与属性都是类的成员,语法上非常相似。索引器一般用在自定义的集合类中,使用索引器来操作集合对象如同使用数组一样简单;
而属性可用于任何自定义的类中,它增强了类中的字段的灵活性
属性 :允许调用方法,如同公共数据成员;可通过简单的名称进行访问;可以为静态成员或者是实例成员;其get访问器没有参数,其set访问器其包含隐式的参数value
属性里面的get;set;访问器其实就是俩个get,set,方法
索引器 :允许调用对象上的方法 ,如同对象是一个数组 ;必须是实例成员;其get,set访问器具有与索引器相同的形参表