C#-类:索引器

news/2024/11/6 8:30:58 标签: c#

索引器作用:可以让我们以中括号的形式访问自定义类中的元素。

规则自己定,访问时和数组一样

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

可以重载,结构体也支持索引器

一:索引器的语法

使用索引器要做好备注,方便调用者知道调用的是什么类型的数据。因为索引器可以重载,需要明确声明的索引器所关联的变量是什么(其实就是用不同的参数来区分关联的变量)

使用索引器时一般是调用数组数据,注意,可在get,set内部做好判空和越界判断

1.1 使用索引器关联数组变量
class Person{

    private Person[] friends;//一般要有配套的数组变量

    public Person this[int index, ... ]{//内部的写法和规则和索引器相同
       get{return friends[index]};
       set{friends[index] = value;}//value代表传入的值。在这里就是new的Person类型的变量
    }
}
------------
void Main(){
    Person p = new Person();
    p[0] = new Person();//调用了set
    Console.WriteLine(p[0]);//调用了get
}
//只做语法演示,代码本身没有实际意义
 1.2 直接调用数组变量
class Person{

    private Person[] friends;
}
------------
void Main(){
    Person p = new Person();
    p.friends[0] = new Person();
    Console.WriteLine(p.friends[0]);
}
//只做语法演示,代码本身没有实际意义

二:索引器的使用

2.1 索引器的完整写法、索引器的重载
class Person{
    private string name;
    private int age;

    private int[,] array;     
    //声明索引器
    public int this[int i, int j]     //public string this[string str]
    {
      //内部的写法和规则和索引器相同
        get{
            return array[i, j];
        }
        set{
            array[i, j] = value;//value代表传入的值,这里是Person类型的
        }
    }

    private Person[] friends;
    //索引器重载2
    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;
        }
    }
    
    //索引器重载3
    public string this[string str]{
        get{
            switch(str){
              case "name":
                 return this.name;
              break;
              case "age":
                 return this.age.ToString();
              break;
        }
        return "";
    }
}
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("索引器");
            Person p = new Person();
            p[0] = new Person();
            Console.WriteLine(p[0]);

            p[0, 0] = 10;
        }
    }
}
2.2 索引器的应用示例
class Test{
  private string[] name = new string[10];
  public string this[int index]{
      get{ return name[index];}
      set{ name[index] = value;}
  }
}

Main(){
    Test t=new Test();
    t[0]="张三";
    t[1]="李四";
    Console.WriteLine(t[0]);
    Console.WriteLine(t[1]);
}
class Week{
  private string[] days={"Mon","Tues","Wed","Thurs","Fri","Sat","Sun"};
  private int GetDay(string day){
      int i=0;
      foreach(string temp in days){
          if(temp==day)
          return i+1;
          i++;
      }
      return -1;
  }
  public int this[string day]{
      get{ return GetDay(day);}
  }
}
Main(){
    Week w=new Week();
    Console.WriteLine(w["Thurs"]);
    Console.WriteLine(w.GetDay("Thurs"));    
}

索引器练习题


http://www.niftyadmin.cn/n/5740648.html

相关文章

数据结构基

一、介绍&#xff1a; 计数排序⼜称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应⽤。 操作步骤&#xff1a; 1&#xff09;统计相同元素出现次数 2&#xff09;根据统计的结果将序列回收到原来的序列中 为了避免浪费空间&#xff0c;把数组中最大值与最小值相减然后1…

Docker 镜像拉不动?自建 Docker Hub 加速站 解决镜像拉取失败

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 众所周知&#xff0c;6 月份的时候&#xff0c;Docker Hub 的镜像就已经无法正常拉取&#xff0c;那会随手用 Nginx 反代了一下 Docker Hub&#xff0c;建了个自用的镜像站&#xff0c;一直用到了 9 月份&…

造纸厂会用到哪些自动化备品备件

以下是一些造纸厂常用的自动化备品备件&#xff1a; 造纸机设备配件&#xff1a; 烘缸、网笼、压榨辊等造纸机核心部件的备品备件&#xff0c;用于确保造纸机的正常运行和纸张的质量。轴承座、导辊瓦架等支撑和传动部件&#xff0c;保证造纸机的稳定性和精度。气垫式流浆箱、水…

搭建你的私人云盘:使用File Browser与cpolar实现公网传输文件

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 File Browser是一个开源的文件管理器和文件共享工具&#xff0c;它可以帮助用户轻…

python和C数据互转

C -> Python 从C返回的地址获得一个int value ctypes.c_int.from_address(addr)得到一个c_int。 再调用c_int.value属性得到python int。 从C返回的地址获得一个struct 比如下面的结构&#xff1a; class DynamicListType(ctypes.Structure):_fields_ [("count&q…

window 利用Putty免密登录远程服务器

1 在本地电脑用putty-gen生成密钥 参考1 参考2 2 服务器端操作 将公钥上传至Linux服务器。 复制上述公钥到服务器端的authorized_keys文件 mkdir ~/.ssh vi ~/.ssh/authorized_keys在vi编辑器中&#xff0c;按下ShiftInsert键或者右键选择粘贴&#xff0c;即可将剪贴板中的文…

Java 实现接口幂等的九种方法:确保系统稳定性与数据一致性

摘要&#xff1a; 在分布式系统中&#xff0c;接口的幂等性至关重要&#xff0c;它能确保重复请求不会导致意外的副作用。本文深入探讨了 Java 实现接口幂等的九种方法&#xff0c;包括数据库唯一约束、状态机、分布式锁等&#xff0c;并通过详细的代码示例和实际应用场景&…

使用免费的飞书机器人,实现消息推送实时通知

大家好&#xff0c;我是小悟。 实际工作中&#xff0c;我们会经常遇到需要给用户发送业务通知的功能需求&#xff0c;如果是小程序端&#xff0c;那么就使用小程序提供的模板消息通知&#xff0c;如果是APP端&#xff0c;一般就是使用个推、极光等第三方平台。 当然还有个万能…