索引器作用:可以让我们以中括号的形式访问自定义类中的元素。
规则自己定,访问时和数组一样
适用于,在类中有数组变量时使用,可以方便的访问、进行逻辑处理
可以重载,结构体也支持索引器
一:索引器的语法
使用索引器要做好备注,方便调用者知道调用的是什么类型的数据。因为索引器可以重载,需要明确声明的索引器所关联的变量是什么(其实就是用不同的参数来区分关联的变量)
使用索引器时一般是调用数组数据,注意,可在get,set内部做好判空和越界判断
1.1 使用索引器关联数组变量
class Person{
private Person[] friends;//一般要有配套的数组变量
public Person this[int index, ... ]{//内部的写法和规则和索引器相同
get{return friends[index]};
set{friends[index] = value;}//value代表传入的值。在这里就是new的Person类型的变量
}
}
------------
void Main(){
Person p = new Person();
p[0] = new Person();//调用了set
Console.WriteLine(p[0]);//调用了get
}
//只做语法演示,代码本身没有实际意义
1.2 直接调用数组变量
class Person{
private Person[] friends;
}
------------
void Main(){
Person p = new Person();
p.friends[0] = new Person();
Console.WriteLine(p.friends[0]);
}
//只做语法演示,代码本身没有实际意义
二:索引器的使用
2.1 索引器的完整写法、索引器的重载
class Person{
private string name;
private int age;
private int[,] array;
//声明索引器
public int this[int i, int j] //public string this[string str]
{
//内部的写法和规则和索引器相同
get{
return array[i, j];
}
set{
array[i, j] = value;//value代表传入的值,这里是Person类型的
}
}
private Person[] friends;
//索引器重载2
public Person this[int index]{
get{
//可以写逻辑的 根据需求来处理这里面的内容
if( friends == null ||friends.Length - 1 < index){
return null;
}
return friends[index];
}
set{
//value代表传入的值
if( friends == null ){
friends = new Person[] { value };
}
else if(index > friends.Length - 1){
//自己定了一个规则 如果索引越界 就默认把最后一个朋友顶掉
friends[friends.Length - 1] = value;
}
friends[index] = value;
}
}
//索引器重载3
public string this[string str]{
get{
switch(str){
case "name":
return this.name;
break;
case "age":
return this.age.ToString();
break;
}
return "";
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("索引器");
Person p = new Person();
p[0] = new Person();
Console.WriteLine(p[0]);
p[0, 0] = 10;
}
}
}
2.2 索引器的应用示例
class Test{
private string[] name = new string[10];
public string this[int index]{
get{ return name[index];}
set{ name[index] = value;}
}
}
Main(){
Test t=new Test();
t[0]="张三";
t[1]="李四";
Console.WriteLine(t[0]);
Console.WriteLine(t[1]);
}
class Week{
private string[] days={"Mon","Tues","Wed","Thurs","Fri","Sat","Sun"};
private int GetDay(string day){
int i=0;
foreach(string temp in days){
if(temp==day)
return i+1;
i++;
}
return -1;
}
public int this[string day]{
get{ return GetDay(day);}
}
}
Main(){
Week w=new Week();
Console.WriteLine(w["Thurs"]);
Console.WriteLine(w.GetDay("Thurs"));
}
索引器练习题