CS3L7——索引器
本章代码关键字
索引器
让对象可以像数组一样通过索引访问其中元素,使程序看起来更直观,更容易编写
可以让我们以中括号的形式范围自定义类中的元素,规则自己规定实现,访问时和数组一样
比较适用于在类中有数组变量时使用,可以方便的访问和逻辑处理
索引器语法
索引器的声明和属性很像
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 { if (friends == null || friends.Length - 1 < index) { return null; } return friends[index]; } set { 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 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] { get => return friends[index]; set => friends[index] = value; }
public int this[int i, int j] { get => array[i, j]; set => array[i, j] = value; }
public string this[string str] { get { switch (str) { case "name": return this.name; case "age": return age.ToString(); }
return ""; } } }
|