上篇博客说到:我本来是想讲解有关索引器的概念,无奈后来发现自己对List等的概念理解不够深刻,又重写复习了一遍,因此今天我们就来讲解有关索引器的使用。
索引器:索引器允许类或者结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于他们的访问采用参数。
---来自博客园 Rising Sun的博客
索引器的语法:可以看到索引器的定义语法与属性特别相似
public int this[int index]
{
get { return list[index]; }
set { list[index] = value; }
}
接下来我们通过小杨老师讲解的例子来讲解这个类在有索引器的情况下与没有索引器的情况下的不同之处:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
Number numl = new Number();//实现Number类为numl
numl.Add(6);
numl.Add(7); //需要先添加后再用数组写入
numl.Add(8);
Console.WriteLine(numl.ToString());
numl[0] = 1;
numl[1] = 1; //用数组替换写入的值
numl[2] = 2;
Console.WriteLine(numl.ToString());
Console.ReadKey();
}
}
public class Number//定义Number类
{
List<int> list = new List<int>();
public void Add(int item)//加入添加的方法
{
list.Add(item);
}
public int this[int index]//声明索引器
{
get { return list[index]; }
set { list[index] = value; }
}
public override string ToString()//遍历
{
string str = "";
foreach (int item in list)
{
str += item;
}
return str;
}
}
}
以上代码的思路:我们先定义一个Number的类,之后在这个类中定义了List并写入了Add的方法,使得numl可以使用添加的方法在其中写入数据,并且定义了索引器,这一系列操作使得numl这个实例化的类可以像数组一样对数据进行索引。
在这个例子中,我本是想单纯的讲解索引器的使用,因此"numl.Add()"的部分看似有些显的多余,但因为某种原因,如果我去掉“numl.Add()”这几个代码,那么运行时就会显示"索引超出范围"这样的bug,所以我只能勉强先添加后再用索引的方式覆盖之前Add好的值。
运行结果:(可以看到后面通过索引的方式覆盖了先前“6、7、8”这三个值)
而如果我们去掉索引器的定义,那么就会报错。这就是有索引器和无索引器的不同之处。
索引器与属性的区别:
-索引器的命名只能为this,而属性可以任意命名(开头字母大写)
-索引器可以重载,属性不可以
-索引器不可用static进行声明,属性可以