CS3L7——索引器

本章代码关键字

1
2
3
get        //索引器中接收值时会执行的关键字
set //索引器中被修改值时会执行的关键字
value //索引器中set代码块中传入的修改的值

索引器

让对象可以像数组一样通过索引访问其中元素,使程序看起来更直观,更容易编写
可以让我们以中括号的形式范围自定义类中的元素,规则自己规定实现,访问时和数组一样
比较适用于在类中有数组变量时使用,可以方便的访问和逻辑处理

索引器语法

索引器的声明和属性很像

1
2
3
4
5
6
访问修饰符 返回值 this[参数类型 参数名, 参数类型 参数名...]
{
内部写法和规则与属性相同
get { return ... }
set { ... = value }
}

语法示例:

索引器内部可以写逻辑,其类似于属性,分别在 get​ 和 set​ 内实现逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Person
{
private string name;
private int age;
private Person[] friends;

private int[,] array;

//相当于函数与属性的综合体,使对象可以像数组一样使用索引来访问对象内元素
#region 索引器中可以写逻辑
public Person this[int index]
{
get
{
//get和set可以写逻辑
if (friends == null || friends.Length - 1 < index)
{
return null;
}
return friends[index];
}
set
{
//value代表传入的值
if (friends == null)
{
friends = new Person[] { value };
}
else if (friends.Length - 1 < index)
{
//相当于自己定了一个规则,若输入的索引越界 就会默认把最后一个朋友顶掉
friends[friends.Length - 1] = value;
}
else
{
friends[index] = value;
}
}
}
}

和属性一样,如果 get​ 或者 set​ 语句块只有一句代码,则可以使用 =>​ 来简写,=>​ 后跟对应的表达式语句:

1
2
3
4
5
6
7
8
9
10
class Test
{
private Test[] array;

public Test this[int index]
{
get => array[index];
set => array[index] = value;
}
}

若索引器是只读的(只有 get​)且 get​ 只有一句代码,则整个代码块都可以使用 =>​ 来简写,=>​ 后跟对应的表达式语句

1
2
3
4
5
6
class Test
{
private Test[] array;

public Test this[int index] => array[index];
}

索引器的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Person
{
private string name;
private Person[] friends;

//相当于函数与属性的综合体,使对象可以像数组一样使用索引来访问对象内元素
public Person this[int index]
{
get => return friends[index];
set => friends[index] = value;
}
}

internal class Program
{
static void Main(string[] args)
{
Person p = new Person();
//类里有索引器后,就可以像这样写
p[0] = new Person();
p[0].name = "MrTang";
Console.WriteLine(p[0].name);
}
}

输出:

1
MrTang

索引器可以重载

索引器同样可以重载,索引器的参数和返回值也是不限的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Person
{
private string name;
private int age;
private Person[] friends;

private int[,] array;

public Person this[int index] // 重载1
{
get => return friends[index];
set => friends[index] = value;
}

public int this[int i, int j] // 重载2
{
get => array[i, j];
set => array[i, j] = value;
}

public string this[string str] // 重载3
{
get
{
switch (str)
{
case "name":
return this.name;
case "age":
return age.ToString();
}

return "";
}
}
}