索引器是一种特殊类型的属性,它允许像访问内部集合的数组一样访问类或结构。 C# 允许我们定义自定义索引器、通用索引器以及重载索引器。
索引器的定义方式与使用this
关键字和方括号 [] 的属性相同。
<返回类型> this[参数类型 index]
{
get{
//返回内部集合的索引的值
}
set{
//在内部集合中的指定索引处设置值
}
}
看一下我们的例子
public class MyFloatList
{
// List<float> 是泛型类型,下一篇会介绍到
private List<float> list = new List<float>(4) { 1, 2, 3, 4 };
public float this[int index]
{
get
{
if (index > list.Count)
{
throw new ArgumentOutOfRangeException(nameof(index), $"索引值{index}超出范围,应小于最大值{list.Count}");
}
return list[index];
}
set
{
if (index > list.Count)
{
throw new ArgumentOutOfRangeException(nameof(index), $"索引值{index}超出范围,应小于最大值{list.Count}");
}
list[index] = value;
}
}
}
上面的 MyFloatList 类为其私有字段List定义了一个索引器。 所以现在,您可以像使用List一样使用 MyFloatList 对 list 进行操作,如下所示。
class Program
{
static void Main(string[] args)
{
var my = new MyFloatList();
my[0] = 1;
my[1] = 2;
my[2] = 3;
my[3] = 4;
//my[5] = 100; //索引超出范围了会抛出我们自定义的异常
for (int i = 0; i < 4; i++)
{
Console.Write(my[i] + ",");
}
}
}
输出
1,2,3,4,
从 C# 7 开始,您可以将表达式主体(expression-bodied syntax)语法用于 get 和 set。
public class MyFloatList
{
private List<float> list = new List<float>(4) { 1, 2, 3, 4 };
public float this[int index]
{
get => list[index];
set => list[index] = value;
}
}
泛型索引器 索引器也可以是泛型的。 以下通用类包括泛型索引器。
public class MyFloatList<T>
{
private List<T> list = new List<T>(4) { default, default, default, default };
public T this[int index]
{
get => list[index];
set => list[index] = value;
}
}
使用上面的泛型类
static void Main(string[] args)
{
var my = new MyFloatList<int>();
my[0] = 1;
my[1] = 2;
my[2] = 3;
my[3] = 4;
for (int i = 0; i < 4; i++)
{
Console.Write(my[i] + ",");
}
}
输出
1,2,3,4,
您可以使用索引的不同数据类型进行重载。 以下示例使用 int 类型索引和字符串类型索引重载索引器。
public class MyFloatList<T>
{
private List<T> list = new List<T>(4) { default, default, default, default };
public T this[int index]
{
get => list[index];
set => list[index] = value;
}
public T this[string index]
{
get
{
var i = Convert.ToInt32(index);
return list[i];
}
set
{
var i = Convert.ToInt32(index);
list[i] = value;
}
}
}
使用上面定义的泛型类,并且使用string索引器来获取值
class Program
{
static void Main(string[] args)
{
var my = new MyFloatList<int>();
my[0] = 1;
my[1] = 2;
my[2] = 3;
my[3] = 4;
for (int i = 0; i < 4; i++)
{
//注意这边是string了
Console.Write(my[i.ToString()] + ",");
}
}
}