面向对象之封装六

索引器

一.索引器基本概念

基本概念

让对象可以像数组一样通过索引访问其中的元素,使程序看起来更直观,更容易编写。

二.索引器语法

访问修饰符 返回值 this[参数类型 参数名,参数类型 参数名…..]

{

​ 内部的写法和规则和索引器相同

​ get{}

​ set{}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Person{
private string name;
private int age;
private Person[] friends;
public Person this[int index]{
get{
return friends[index];
}
set{
//value代表传入的值
friends[index]=value;
}
}//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
25
26
27
28
29
namespace 语法知识
{
class Person{
private string name;
private int age;
private Person[] friends;
public Person this[int index]{
get{
return friends[index];
}
set{
//value代表传入的值
friends[index]=value;
}
}//index代表下标索引,表示要找第几个朋友
}
internal class Program
{
static void Main(string[] args)
{
Person p=new Person();
p[0]=new Person();
//有索引器了,可以像访问数组一样进行访问。
//此时会执行索引器中set(访问)模块。
Console.WriteLine(p[0]);
//相当于访问get方法。
}
}
}

四.索引器中可以写逻辑

get,set里面可以写逻辑,根据需求来处理内容。

因为在上面的索引器中,friends数组如果没有进行初始化,默认为空(即指针为null),此时如果进行索引,肯定会报错。外面可以在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
class Person{
private string name;
private int age;
private Person[] friends;
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;
}
}//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
25
26
27
28
29
30
31
32
33
34
class Person{
private string name;
private int age;
private Person[] friends;
public string str1;
private int [,] array;
public int this[int i,int j];
//重载了索引器.
{
get{
return 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 "";
//这一步是因为不是所有字符串都会进到switch中,如果没有这一步,那么那些没进去的字符串就没有返回值,违背get必须有返回值的原则。
}set{
str=value;
}
}
//在主函数中
Person p =new Person();
p[0,0]=10;
p[str]="age";
//因为重载中,二维数组没有初始化,所以可能会报错(毕竟数组都没有),可以自己写逻辑进行完善,这里不过多赘述。

在string 的这个索引器中,我们可以实现外面传入字符串来查找相关变量名的数据的功能,相当有意思。

索引器一定要配合数组使用!!!!!!!!!!

附:

索引器对我们来说的主要作用:可以让我们以中括号的形式自定义类中的元素,规则自己定,访问时和数组一样。

比较适用于在类中有数组变量时使用,可以方便的访问和进行逻辑处理。

结构体里面也是支持索引器的!!!


面向对象之封装六
https://gaster44.github.io/2023/12/20/面向对象之封装六/
作者
huangjinhong
发布于
2023年12月20日
许可协议