【C#进阶】C# 索引器

序号系列文章
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): 是指编程语言中可以更容易的表达一个操作的语法,它可以使程序员更加容易去使用这门语言。语法糖使得操作可以变得更加清晰、方便,或者更加符合程序员的编程习惯。 ↩︎

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

News乐鑫科技亮相德国嵌入式展 Embedded World 2023!

3 月 14 日&#xff0c;德国纽伦堡嵌入式展 Embedded World 2023 火热启幕。本届 Embedded World 主题为 “embedded. responsible. sustainable”&#xff0c;乐鑫科技 (688018.SH) 携众多 AIoT 科技成果亮相展会&#xff0c;致力于打造更智能、更互联、更绿色的物联网未来。…

Linux - 进程地址空间

引入在学习C语言的时候&#xff0c;内存包括栈区、堆区、静态区这个布局是内存吗&#xff1f; 不是&#xff01;&#xff01; 这是进程地址空间&#xff01;下面测试一下&#xff1a;11540是bash进程我们修改一下源程序&#xff0c;在观察下结果发现父进程的g_value的值不变&am…

TVS和稳压管的相同点和不同点

大家好,我是记得诚。 文章目录 介绍相同点不同点介绍 TVS和稳压管都是电路中很常用的电子元器件,都是二极管的一个种类。 TVS二极管全称是Transient voltage suppression diode,也叫瞬态电压抑制二极管。 稳压二极管英文名字Zener diode,又叫齐纳二极管。 关于稳压二极…

微信小程序项目实例——扫雷

今日推荐&#x1f481;‍♂️ 2023许嵩演唱会即将到来&#x1f3a4;&#x1f3a4;&#x1f3a4;大家一起冲冲冲&#x1f3c3;‍♂️&#x1f3c3;‍♂️&#x1f3c3;‍♂️ &#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;往期优质项目实例&#x1f52e…

win10下使用docker运行部署nginx,mysql

一、docker的步骤&#xff1a;1.进入docker官网下载安装包2.打开控制面板 - 程序和功能 - 启用或关闭Windows功能&#xff0c;勾选Hyper-V&#xff0c;然后点击确定即可&#xff0c;如图&#xff1a;3.重新启动电脑4.启动Docker在桌面找到Docker for Windows快捷方式&#xff0…

学习PCB设计前的知识扫盲

参考&#xff1a; 走进工厂&#xff1a;PCB线路板是如何制造出来的 学习PCB设计前的知识扫盲&#xff0c;新手向&#xff0c;越新手越好&#xff01; 下一步可继续学习简易的PCB绘制&#xff1a; 如何快速阅读芯片数据手册&#xff08;初学者和外行进&#xff09; 【完结】极简…

【Java】看看关于代码块的这些知识,你掌握了多少?

作者&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;算法、数据结构、Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】&#xff1b;该专栏专注于Java相关知识&#xff0c…

文心一言,通营销之学,成一家之言,百度人工智能AI大数据模型文心一言Python3.10接入

“文心”取自《文心雕龙》一书的开篇&#xff0c;作者刘勰在书中引述了一个古代典故&#xff1a;春秋时期&#xff0c;鲁国有一位名叫孔文子的大夫&#xff0c;他在学问上非常有造诣&#xff0c;但是他的儿子却不学无术&#xff0c;孔文子非常痛心。 一天&#xff0c;孔文子在…

字节跳动软件测试岗,前两面过了,第三面HR天坑!竟然跟我说……

阎王易见&#xff0c;小鬼难缠。我一直相信这个世界上好人居多&#xff0c;但是也没想到自己也会在阴沟里翻船。我感觉自己被字节跳动的HR坑了。在这里&#xff0c;我只想告诫大家&#xff0c;offer一定要拿到自己的手里才是真的&#xff0c;口头offer都是不牢靠的&#xff0c;…

算法刷题总结 (四) 动态规划

算法总结4 动态规划一、动态规划1.1、基础问题11.1.1、509. 斐波那契数列1.1.2、70. 爬楼梯1.1.3、746. 使用最小花费爬楼梯1.2、基础问题21.2.1、62. 不同路径1.2.2、63. 不同路径Ⅱ1.2.3、64. 最小路径和1.2.4、343. 整数拆分1.2.5、96. 不同的二叉搜索树1.3、背包问题1.3.1、…

嵌入式学习笔记——STM32的时钟树

时钟树前言时钟树时钟分类时钟树框图LSI与LSEHSI、HSE与PLL系统时钟的产生举例AHB、APBx的时钟配置时钟树相关寄存器介绍1.时钟控制寄存器&#xff08;RCC_CR&#xff09;2.RCC PLL 配置寄存器 (RCC_PLLCFGR)3.RCC 时钟配置寄存器 (RCC_CFGR)4.RCC 时钟中断寄存器 (RCC_CIR)修改…

Java中的二叉树

文章目录前言一、树形结构&#xff08;了解&#xff09;1.1 概念1.2 概念&#xff08;重要&#xff09;1.3 树的表示形式&#xff08;了解&#xff09;1.4 树的应用二、二叉树&#xff08;重点&#xff09;2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.5 二叉树的存储2.5 二…

数据挖掘(2.2)--数据预处理

目录 二、数据描述 1.描述数据中心趋势 1.1平均值和截断均值 1.2加权平均值 1.3中位数&#xff08;Median&#xff09;和众数(Mode) 2.描述数据的分散程度 2.1箱线图 2.2方差和标准差 2.3正态分布 3.数据清洗 3.1数据缺失的处理 3.2数据清洗 二、数据描述 描述数…

【IDEA插件开发】环境搭建

基础信息 GRADLE 7.5.1 IDEA IntelliJ IDEA 2020.1.1 (Ultimate Edition) Build #IU-201.7223.91, built on April 30, 2020 Licensed to https://zhile.io You have a perpetual fallback license for this version Subscription is active until July 8, 2089 Runtime ve…

蓝桥杯嵌入式第一课--创建工程

概述学习本节之前&#xff0c;必须要先安装好 keil5 以及 CubeMX 等软硬件环境&#xff0c;如果你已经安装完成&#xff0c;请告诉自己&#xff1a;考试现在开始&#xff01;从CubeMX开始CubeMX是创建工程模板的软件&#xff0c;也是我们比赛时第一个要进行操作的软件。一、选择…

【十二天学java】day01-Java基础语法

day01 - Java基础语法 1. 人机交互 1.1 什么是cmd&#xff1f; 就是在windows操作系统中&#xff0c;利用命令行的方式去操作计算机。 我们可以利用cmd命令去操作计算机&#xff0c;比如&#xff1a;打开文件&#xff0c;打开文件夹&#xff0c;创建文件夹等。 1.2 如何打…

介绍两款红队常用的信息收集组合工具

介绍两款红队常用的信息收集组合工具1.Ehole本地识别FOFA识别结果输出2.AlliN1.Ehole EHole(棱洞)3.0 红队重点攻击系统指纹探测工具 EHole是一款对资产中重点系统指纹识别的工具&#xff0c;在红队作战中&#xff0c;信息收集是必不可少的环节&#xff0c;如何才能从大量的资…

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(3)

写在前面&#xff1a; 怎么样才能学好一个算法&#xff1f; 我个人认为&#xff0c;系统性的刷题尤为重要&#xff0c; 所以&#xff0c;为了学好深度优先搜索&#xff0c;为了用好暴搜应对蓝桥杯&#xff0c; 事不宜迟&#xff0c;我们即刻开始刷题&#xff01; 题目&…

Spring Cloud Alibaba全家桶(五)——微服务组件Nacos配置中心

前言 本文小新为大家带来 微服务组件Nacos配置中心 相关知识&#xff0c;具体内容包括Nacos Config快速开始指引&#xff0c;搭建nacos-config服务&#xff0c;Config相关配置&#xff0c;配置的优先级&#xff0c;RefreshScope注解等进行详尽介绍~ 不积跬步&#xff0c;无以至…

关于Linux多线程

文章目录Linux线程的概念什么是线程二级页表线程的优点线程的缺点线程异常线程用途Linux进程VS线程进程和线程进程的多个线程共享进程和线程的关系Linux线程控制POSIX线程库线程创建线程等待线程终止分离线程Linux线程的概念 什么是线程 在一个程序里的一个执行路线就叫做线程…