C#索引器的实现、索引器和属性的异同对比,这些技能你get到了嘛?

简介: C#索引器的实现、索引器和属性的异同对比,这些技能你get到了嘛?

 

目录

什么是索引器?

如何声明索引器?

索引器和属性的异同对比

索引器实例分析


Hello!大家好,我是努力赚钱买生发水的灰小猿!

最近在用C#做开发的时候要用到索引函数,所以今天就在这里和小伙伴记录一下C#中索引器的实现。

什么是索引器?

在C#中,索引器允许类或结构的实例按照和数组相同的方式进行索引,索引器类似于属性,不同之处在于他们的访问采用参数,而实际上,索引器提供了一种访问类或结构的方法,即允许按照和类、结构或接口相同的方式进行索引,它的引入的目的是为了让程序更加的直观便于理解。

如何声明索引器?

索引器提供了一种特殊的方法,来对类或结构体中的对象进行赋值和访问,要在类或结构上声明索引器,需要使用this关键字,索引器的定义格式如下:

[修饰符] 数据类型 this[索引类型 index]
{
    get{//获得属性的代码}                                                 
    set{ //设置属性的代码}
}

image.gif

其中修饰符包括:public,protected,private,internal,new,virtual,sealed,override,abstract,extern.

数据类型是表示将要存取的数组或集合元素的类型,如string、int等。

this关键字引用当前类的实例,从中可以看到,对索引器和对普通属性一样,为它提供set和get访问器,这些访问器指定使用该索引器时将引用什么内部成员。

索引器类型表示该索引器使用哪一类型的索引来存取数组或集合元素,可以是整数同时也可以是字符串。

索引器和属性的异同对比

在定义上,索引器和属性相似,具有如下的相似点:

    • 它们都属于函数成员,都不用分配内存来存储。
    • 它们都主要用来被访问其他数据成员,与这些数据成员相关联,并且为这些成员提供获取和设置访问。

    索引器和属性的区别如下:

      • 属性允许调用方法,如同它们是公共数据字段,索引器允许调用对象的方法,如同对象是一个数组。
      • 属性可以通过简单的名称进行访问,索引器可以通过索引器进行访问。
      • 属性可以作为静态成员或实例成员,索引器必须作为实例成员。
      • 属性的get访问器没有参数,索引器的get访问器具有和索引器相同的形参表。
      • 属性的set访问器包含隐藏value参数,索引器的set访问器除了value参数外,还具有和索引器相同的形参表。

      索引器实例分析

      比如下面这个程序,

      定义一个课程类Couse,在该类中定义三个私有成员Chinese、English、Math,通过索引函数访问该类的私有成员,并对这三个私有成员进行读写操作。

      首先是定义Couse类,并在该类中实现索引器:

      //定义类Couse
      class Couse
      {
      //定义私有成员变量
              private float Chinese;
              private float English;
              private float Math;
      //定义索引器,该索引器的修饰符是public,数据类型是float,索引类型是string
              public float this[string name]
              {
      //定义get方法对成员进行读取
                  get
                  {
                      switch (name)
                      {
                          case "语文":
                              return Chinese;                     
                          case "英语":
                              return English;                       
                          case "数学":
                              return Math;      
                          default:
                              return 0;                   
                      }
                  }
      //定义set方法对成员进行写入
                  set
                  {
                      switch (name)
                      {
                          case "语文":
                              Chinese = value;
                              break;
                          case "英语":
                              English = value;
                              break;
                          case "数学":
                              Math = value;
                              break;
                      }
                  }
              }
          }

      image.gif

      在主类中调用Couse类和索引器,对成员变量进行读写:

      class Program
          {
              static void Main(string[] args)
              {
                  //新建一个对象接收Couse类
                  Couse couse = new Couse();
                  couse["语文"] = 100;  //通过“语文”索引对Chinese进行赋值
                  couse["英语"] = 99;   //通过“英语”索引对English进行赋值
                  couse["数学"] = 98;   //通过“数学”索引对Math进行赋值
                  //通过相应的索引获取到成员的值并输出
                   Console.WriteLine("语文:" + couse["语文"]);
                   Console.WriteLine("英语:" + couse["英语"]);
                   Console.WriteLine("数学:" + couse["数学"]);
              }
          }

      image.gif

      运行结果如下:

      image.gif编辑

      在上述程序中首先在定义Couse类并在其中设置索引器,之后在主方法中调用该类,并通过索引对成员变量进行赋值,之后再通过索引对相应的成员变量进行调用。

      好了,内容不多也好理解。

      觉得不错记得点赞关注大灰狼哟!

      同时有喜欢Python的小伙伴也可以关注我的微信公众号“灰狼洞主”后台回复“Python笔记”获取Python从入门到精通笔记分享Python常用函数方法速查手册哟!

      大灰狼期待与你一同进步!

      image.gif编辑

      目录
      相关文章
      |
      3月前
      |
      存储 安全 编译器
      C# 11.0中的泛型属性:类型安全的新篇章
      【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
      |
      3月前
      |
      网络协议 API C#
      C# 中模拟 POST 和 GET 请求的原理与实践
      【1月更文挑战第4天】在现代网络应用中,HTTP请求是客户端与服务器交互的基础。其中,GET和POST是最常用的两种请求方法。本文将介绍如何使用C#语言模拟这两种请求,并解释其背后的工作原理。我们将利用.NET框架中的HttpClient类来发送请求,并处理服务器的响应。通过本文,读者将能够理解HTTP请求的基本构成,学会在C#中编写代码来模拟这些请求,进而在开发过程中实现与Web服务的交互。
      |
      2月前
      |
      存储 JavaScript C#
      ROS CDK魔法书:点亮博客上云新技能(C#篇)
      阿里云ROS CDK结合OSS的资源编排教程,教你如何以代码定义云资源,简化部署流程。ROS CDK允许使用编程语言(如TypeScript、C#)代替JSON或YAML模板,创建和管理云资源,如OSS Bucket。通过Asset模块,本地文件被转化为云资源,ROS CDK的`ros-cdk-ossassets`和`ros-cdk-ossdeployment`则负责资源上传和管理。教程以创建和部署博客到OSS为例,展示了从初始化项目、配置凭证到编写CDK代码,再到打包、部署和更新资源栈的全过程。使用ROS CDK,开发者能更高效地实现云上资源的自动化运维和管理。
      530 1
      |
      3月前
      |
      存储 编译器 C#
      |
      15天前
      |
      存储 安全 编译器
      C#中的属性
      C#中的属性
      33 7
      |
      2月前
      |
      开发框架 .NET 编译器
      程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
      程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
      20 2
      |
      1月前
      |
      C#
      C#中使用IntPtr.Size属性来判断当前系统是32位还是64位
      这段代码首先检查 `IntPtr.Size`的值,如果是4,则输出"当前系统是32位";如果是8,则输出"当前系统是64位";如果都不是,就输出"未知系统位数"。
      27 0
      |
      2月前
      |
      开发框架 .NET 程序员
      掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
      掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
      17 0
      |
      3月前
      |
      存储 JSON C#
      C# 通过阿里云接口实现人脸属性识别
      C# 通过阿里云接口实现人脸属性识别
      |
      3月前
      |
      数据采集 数据可视化 搜索推荐
      提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票
      使用C#和Fizzler库,开发一个多线程爬虫,高效抓取五一假期特价机票信息。通过代理IP规避反爬策略,实现实时数据更新、个性化推送及数据可视化分析。示例代码展示如何配置代理、发送HTTP请求、解析HTML并提取机票详情。注意适应实际环境调整参数。祝编码愉快!
      提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票