【C#进阶】C# 索引器

news2024/12/25 1:40:19
序号系列文章
13【C#进阶】C# 特性
14【C#进阶】C# 反射
15【C#进阶】C# 属性

文章目录

  • 前言
  • 1、索引器的概念
  • 2、索引器的定义
  • 3、索引器的基本使用
  • 4、索引器的重载
  • 5、接口中的索引器
  • 6、属性和索引器之间的比较
  • 7、索引器的适用场景
  • 结语

前言

🍂 Hello大家好啊,我是作家桑。本文为大家介绍 C# 中的索引器。


1、索引器的概念

索引器允许类或结构的实例就像数组一样进行索引。无需显式指定类型或实例成员,即可通过运算符[]设置或检索索引值。索引器类似于属性,不同的是索引器的访问器需要使用参数。

2、索引器的定义

在 C# 中可以使用 this 关键字作为属性名声明索引器,并在方括号内声明参数。索引器也可以使用 C# 中任何有效的访问修饰符,在索引器中为 get 和 set 访问器前指定不同的访问修饰符即可。和属性的定义一样,索引器内也需要定义 get 和 set 访问器,其中 get 访问器返回值。 set 访问器分配值。

示例代码:

public int this[string key]
{
    get { return storage.Find(key); }
    set { storage.SetAt(key, value); }
}
  • 其中方括号内的参数 key 表示调用索引器时的索引值
  • value 参数是 set 访问器里内置的,表示调用索引器时的分配值

你也可以编写只读索引器(忽略 set 访问器)或只写索引器(忽略 get 访问器)。

只读索引器:

// 忽略 set 访问器
public int this[string key]
{
    get { return storage.Find(key); }
}

只写索引器:

// 忽略 get 访问器
public int this[string key]
{
    set { storage.SetAt(key, value); }
}

3、索引器的基本使用

索引器可以方便地在类、结构体和接口上创建,以便调用方程序可以像数组一样访问它们。在定义好索引器之后,基本的使用就是通过[]运算符对索引器进行访问和对元素进行赋值。

示例代码:

using System;

public class Indexedweek
{
    string[] weekarray = new string[daysCount];
    static int daysCount = 7; 


    public Indexedweek()
    {
        for (int i = 0; i < daysCount; i++)
            weekarray[i] = "Week";
    }

    // 定义索引器 
    public string this[int index]
    {
        get
        {
            string week;        
                            
            if (index >= 0 && index <= daysCount - 1)
                week = weekarray[index];         
            else
                week = "";      
                    
            return week;
        }
        set
        {
            if (index >= 0 && index <= daysCount - 1)
                weekarray[index] = value;
        }
    }

    static void Main(string[] args)
    {
        Indexedweek weeks = new Indexedweek();
        weeks[0] = "Monday";
        weeks[1] = "Tuesday";
        weeks[2] = "Wednesday";
        weeks[3] = "Thursday";
        weeks[4] = "Friday";
        weeks[5] = "Saturday";
        weeks[6] = "Sunday";

        for (int i = 0; i < Indexedweek.daysCount; i++)
        {
            Console.WriteLine(weeks[i]);
        }

        Console.ReadLine();
    }
}

运行结果:
在这里插入图片描述
在上面的示例中,我们使用关键字 this 定义了索引器。其中 get 访问器用于输出 weekarray 数组中的元素,set 访问器用于将指定的 value 值赋值给 weekarray 数组。在 Main 方法中就可以直接使用[]运算符调用我们定义的索引器的功能。

4、索引器的重载

不仅是方法,索引器也可被重载。虽然索引器和属性类似,但是在索引器的参数上可区分索引器和属性。只要分别对索引器的参数声明不同的类型,就可以在类中创建使用一个或多个索引器。

以上面计算星期天数的代码为示例。

代码示例:

// 定义索引器 
public string this[int index]
{
    get
    {
        string week;
				
        if (index >= 0 && index <= daysCount - 1)
            week = weekarray[index];
        else
            week = "";

        return week;
    }
    set
    {
        if (index >= 0 && index <= daysCount - 1)
            weekarray[index] = value;
    }
}

// 重载索引器
public int this[string myWeek]
{
    get
    {
        int index = 0; 

        while(index < daysCount)
        {
            if (weekarray[index] == myWeek)
            {
                return index;
            }       
            index++;
        }
        return -1;      // 返回-1表示没有找到
    }
}
// 返回数组中指定元素的索引值
Console.WriteLine(weeks["Sunday"]);

运行结果:
运行结果

5、接口中的索引器

索引器不仅可以在类和结构体中实现,也可以在接口中创建。但是接口索引器的访问器与类索引器的访问器有所不同,有以下两个差异:

  • 接口访问器不使用修饰符
  • 接口访问器通常没有正文

虽然接口中的索引器可以被实现,但是这种情况非常少见。索引器通常定义 API1 来访问数据字段,而数据字段无法在接口中定义。

代码示例:

//接口上的索引器
public interface IIndexInterface
{
    // 索引器声明
    int this[int index]
    {
        get;
        set;
    }
}

// 实现接口
class IndexerClass : IIndexInterface
{
    private int[] arr = new int[100];
    public int this[int index]   // 实现接口中的索引器
    {
        get => arr[index];
        set => arr[index] = value;
    }

    static void Main(string[] args)
    {
        IndexerClass test = new IndexerClass();
        int count = 1; 

        //调用索引器初始化它的元素。 
        for (int i = 0; i < 10; i++)
        {
            test[i] = count;
            count++;
        }

        for (int i = 0; i < 10; i++)
        {
            System.Console.WriteLine($"元素 #{i} = {test[i]}");
        }
    }
}

运行结果:
在这里插入图片描述

6、属性和索引器之间的比较

索引器与属性相似,以一个表格来展示两者之间的差别。除了这些差别之外,对属性访问器定义的所有规则也适用于索引器访问器。

表格如下:

属性索引器
允许以将方法视作公共数据成员的方式调用方法。通过在对象自身上使用数组表示法,允许访问对象内部集合的元素。
通过简单名称访问。通过索引访问。
可为静态成员或实例成员。必须是实例成员。
属性的 get 访问器没有任何参数。索引器的 get 访问器具有与索引器相同的形参列表。
属性的 set 访问器包含隐式 value 参数。索引器的 set 访问器具有与索引器相同的形参列表,value 参数也是如此。
通过自动实现的属性支持简短语法。支持仅使用索引器的 expression-bodied2 成员。

7、索引器的适用场景

列举一些索引器在程序中的适用场景,借此可以对索引器有一个更好的理解。

  • 需要简化接口在类中集合的访问时,索引器也是一种语法糖3
  • 类表示的是对象的列表、集合或数组时
  • 当类型需要对数组或矢量进行建模时
  • 需要对字典数据或映射进行建模时

点击了解更多索引器的使用。


结语

🍃 以上就是 C# 索引器的介绍啦,希望对大家有所帮助。感谢大家的支持。


  1. API: 全称 Application Programming Interface,即应用程序编程接口。是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 ↩︎

  2. Expression-bodied: 是将 lambda 表达式的这种用法扩展到了方法、属性等成员上,表示成员的实现。 ↩︎

  3. 语法糖(syntactic sugar): 是指编程语言中可以更容易的表达一个操作的语法,它可以使程序员更加容易去使用这门语言。语法糖使得操作可以变得更加清晰、方便,或者更加符合程序员的编程习惯。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java会员管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

从零开始 Spring Boot 46:@Lookup

从零开始 Spring Boot 46&#xff1a;Lookup 图源&#xff1a;简书 (jianshu.com) 在前文中&#xff0c;我介绍了 Spring Bean 的作用域&#xff08;Scope&#xff09;&#xff0c;且讨论了将一个短生命周期的 bean &#xff08;比如request作用域的 bean&#xff09;注入到长…

事务小总结

事务定义 是一个数据库操作序列&#xff0c;这些操作要么全部执行,要么全部不执行&#xff0c;是一个不可分割的工作&#xff08;程序执行&#xff09;单元。事务由事务开始与事务结束之间执行的全部数据库操作组成。 事务特性 原子性(Atomicity)一致性(Consistency)隔离性(…

Linux下 文件删除但是空间未被释放 或者 磁盘已满但找不到对应的大文件 的解决方案

Linux下文件删除但是空间未被释放的解决方案 前言1. 查看当前磁盘占用情况2. 模拟进程占用3. 执行rm -rf 命令删除文件4. 查看被删除但是未释放空间的文件5. 执行清空文件操作 前言 linux磁盘空间已满&#xff0c;手动rm -rf 删除了大文件之后&#xff0c;df -h 查看一下发现空…

操作系统第四章练习题

第一部分 教材习题&#xff08;P152&#xff09; 1、为什么要配置层次式存储器&#xff1f; 设置多个存储器能够使存储器两头的硬件能并行工作;采用多级存储系统,专门是Cache 技术,是减轻存储器带宽对系统性能影响的最佳结构方案;在微处置机内部设置各类缓冲存储器,减轻对存储…

【Android -- 面试】Android 面试题集锦(Java 基础)

Java 基础 1、Java 的类加载过程 jvm 将 .class 类文件信息加载到内存并解析成对应的 class 对象的过程&#xff0c; 注意&#xff1a;jvm 并不是一开始就把所有的类加载进内存中&#xff0c;只是在第一次遇到某个需要运行的类才会加载&#xff0c;并且只加载一次 主要分为三…

【ARMv8 SIMD和浮点指令编程】NEON 比较指令——比较的方方面面

比较指令是常见的一类指令,NEON 中当然也排除,下面涉及比较和测试位两类指令。 1 CMEQ (register) 按位比较相等(向量)。该指令将第一个源 SIMD&FP 寄存器中的每个向量元素与第二个源 SIMD&FP 寄存器中的相应向量元素进行比较,如果比较相等,则将目标 SIMD&…

基于Python+Django+mysql+html通讯录管理系统

基于PythonDjangomysqlhtml通讯录管理系统 一、系统介绍二、功能展示1.用户登陆2.用户注册3.密码修改4.查询5.添加6.修改7.删除 三、其它系统四、获取源码 一、系统介绍 该系统实现了 用户登陆、用户注册、密码修改、查询信息、添加信息&#xff0c;修改信息、删除信息 运行环…

vue2脚手架可视化小项目

vue2脚手架小项目 这个项目又数据可视化可以通过点击按钮修改数据&#xff0c;同时图形的内容也会随着变化这里面也又保存功能&#xff0c;搜索功能&#xff0c;添加功能用到的框架有vue2脚手架&#xff0c;语言有bootstrap&#xff0c;css&#xff0c;也用了echarts 下面会先…

从Web2.0走向Web3.0还有多远?

Web2.0时代给互联网带来了巨大的变革&#xff0c;让用户成为内容的创造者和共享者。然而&#xff0c;随着技术的不断发展和创新&#xff0c;我们正在逐渐迈向Web3.0时代&#xff0c;这将是一个更加去中心化、透明和安全的数字世界。那么&#xff0c;从Web2.0走向Web3.0还有多远…

202322读书笔记|《给你一个大抱抱:治愈系暖心绘本》——如果事与愿违,请相信一切自由安排

&#xff3b;TOC&#xff3d;(202322读书笔记&#xff5c;《给你一个大抱抱&#xff1a;治愈系暖心绘本》——如果事与愿违&#xff0c;请相信一切自由安排 作者白开水DAWAN&#xff0c;治愈系小说&#xff0c;画面明媚有趣轻松&#x1f92a;&#x1f92a;&#x1f618;&#…

learn C++ NO.10——string(3)

引言&#xff1a; 现在是北京时间2023年6月22日的早上8点。又是一年端午&#xff0c;时光如梭。这一年来发生的变化太多了&#xff0c;遥想去年此时&#xff0c;我还沉浸在被大学录取的喜悦中&#xff0c;转眼间大一就过去了。这里我也衷心的祝愿您和您的家人端午安康&#xf…

Triton教程 --- 自定义操作

Triton教程 — 自定义操作 Triton系列教程: 快速开始利用Triton部署你自己的模型Triton架构模型仓库存储代理模型设置优化动态批处理速率限制器模型管理 自定义操作 Triton 推理服务器部分支持允许自定义操作的建模框架。 自定义操作可以在构建时或启动时添加到 Triton&…

前端3D Three.js 在本地搭建一个官方网站

上文Web前端 3D开发入门规划 3D效果将不再是桌面应用的专利我们说了说 WEB 3D的一个发展和学习方向 那么 我们还是先搞定文档使用的问题 我们可以访问http://www.yanhuangxueyuan.com/Three.js/这里面可以查到使用方法 但不是最新的 而是别人用官方文档改的 真正的官方文档地址…

30 linux 新建进程的进程号是如何分配的?

前言 呵呵 进程号是我们经常使用到的, 但是 却从来 没有深究过的东西 这里 就来看一下 具体的进程号的生成方式 linux 新建进程是以 fork exec 的形式创建进程的 子进程 是 复制自 父进程 pid 是怎么生成的? 分配 pid 的地方调用堆栈如下, fork 之后, 会为 新进程 申…

全志V3S嵌入式驱动开发(基于usb otg的spi-nand镜像烧入)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过spi nand驱动&#xff0c;但是这个驱动是建立在linux系统从sd卡加载的情况下进行的。开发测试的情况下&#xff0c;这么做或许是可以的…

PWM详解(嵌入式学习)

这里写目录标题 前言定义参数工作原理应用练习 前言 在STM32微控制器中&#xff0c;PWM代表脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;。PWM是一种用于控制电子设备的技术&#xff0c;通过调整信号的脉冲宽度和周期&#xff0c;可以模拟出不同的电压或功率级…

【python】—— 基础语法(一)

序言&#xff1a; 在之前&#xff0c;我们已经对【python】的开发环境进行了相应的安装&#xff0c;紧接着本期我就讲给大家介绍它的相关语法。对于学过【C/C】或者其他语言的小伙伴来说&#xff0c;语法内容学习起来就会掌握的很快了。 目录 前言 &#xff08;一&#xff0…

【架构师】零基础到精通——网关策略

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名退役Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小…

vue服务端渲染SSR

一&#xff1a;ssr的理解 1、服务端渲染 Server Side Render SSR解决方案&#xff0c;后端渲染出完整的首屏的dom结构返回&#xff0c;前端拿到的内容包括首屏及完整spa结构&#xff0c;应用激活后依然按照spa方式运行&#xff0c;这种页面渲染方式被称为服务端渲染 (server si…