一:索引器允许类和结构的实例按照与数组相同的方式进行索引,索引器类似与属性,不同之处在于他们的访问器采用参数。被称为有参属性。
如:简单索引器实例:
using System;
using System.Collections.Generic;
using System.Linq; using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
IndexClass Temple = new IndexClass();
Temple[0] = "孙三";
Temple[1] = "业四";
Temple[2] = "宝五";
Console.WriteLine("冠位大爷为:{0}",Temple[0]);
Console.WriteLine("亚位大爷为:{0}", Temple[1]);
Console.WriteLine("季位大爷为 :{0}", Temple[2]);
Console.ReadLine();
}
}
class IndexClass
{
private string[] name = new string[100];
public string this[int index]
{
get {
if (index=100)
return name[0];
else
return name[index];
}
set
{
if (index < 0 || index > 100)
name[0] = value;
else
this.name[index] = value;
}
}
}
}
上例中的索引器与数组有些相似:但是索引器与数组是有区别的体现在如下:
1)索引器的索引值不受类型的限制。而用来访问数组的索引值一琮是整数。
2)索引器允许重载,一个类可以有多个索引器。
3)索引器允许类和结构的实例按照与数组相同的方式进行索引,索引器类似于属性,不同之处在于他们的访问器采用参数,被称为有参属性。
4)属性以名称来标识,索引器以函数签名来标识。索引器可以被重载,属性则不可以被重载。属性可以为静态的,索引器属于实例成员,不能被声明为static。
而且索引器可以是多参的也就是作为索引的参数可以为多个如下:
using System;
using System.Collections.Generic;
using System.Linq; using System.Text;
using System.Collections;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
ScoreIndex si = new ScoreIndex();
si["张三", 1] = 90;
si["张三", 2] = 100;
si["张三", 3] = 98;
si["李四", 1] = 94;
si["李四", 2] = 88;
si["李四", 3] = 96;
Console.WriteLine("张三的编号为1 的成绩为:{0}",si["张三",1]);
Console.WriteLine("张三的所有成绩为: ");
ArrayList arrTemp; arrTemp=si["张三"];
foreach (IndexClass item in arrTemp)
{
Console.WriteLine("姓名:"+item.Name+" 课程编号: "+item.CourseId+" 成绩: "+item.Score+"\r\n");
}
Console.ReadLine();
}
}
class IndexClass
{
private string _name;
private int _courseId;
private int _score;
public IndexClass(string _name,int _courseId,int _score)
{
this._name = _name;
this._courseId = _courseId;
this._score = _score;
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public int CourseId
{
get { return _courseId; }
set { _courseId = value; }
}
public int Score
{
get { return _score; }
set { _score = value; }
}
}
class ScoreIndex
{
private ArrayList arr;
public ScoreIndex()
{
arr = new ArrayList();
}
public int this[string _name, int _courseId]
{
get
{
foreach (IndexClass item in arr)
{
if (item.Name == _name && item.CourseId == _courseId)
{
return item.Score;
}
}
return -1;
}
set
{
arr.Add(new IndexClass(_name,_courseId,value));
}
}
//重载索引器
public ArrayList this[string _name]
{
get {
ArrayList temp = new ArrayList();
foreach (IndexClass a in arr)
{
if (a.Name == _name)
{
temp.Add(a);
}
}
return temp;
}
}
}
}