【C#进阶】C# 索引器

这篇具有很好参考价值的文章主要介绍了【C#进阶】C# 索引器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

序号 系列文章
13 【C#进阶】C# 特性
14 【C#进阶】C# 反射
15 【C#进阶】C# 属性

前言

🍂 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();
    }
}

运行结果:
【C#进阶】C# 索引器
在上面的示例中,我们使用关键字 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"]);

运行结果:
【C#进阶】C# 索引器

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]}");
        }
    }
}

运行结果:
【C#进阶】C# 索引器

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

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

表格如下:

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

7、索引器的适用场景

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

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

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


结语

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


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

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

  3. 语法糖(syntactic sugar): 是指编程语言中可以更容易的表达一个操作的语法,它可以使程序员更加容易去使用这门语言。语法糖使得操作可以变得更加清晰、方便,或者更加符合程序员的编程习惯。 ↩︎文章来源地址https://www.toymoban.com/news/detail-464838.html

到了这里,关于【C#进阶】C# 索引器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 索引器

    以下为个人理解,不喜勿喷: 索引器主要包含三个知识点: 1.索引器是针对于数组的属性 C#中属性是针对于字段的,通过set和get限制字段的访问与赋值。 同样,索引器也具有set和get,可以通过set和get限制对数组的访问与赋值。 2.索引器能够建立类与类内数组的索引 为便于解

    2023年04月09日
    浏览(24)
  • 进阶数据库系列(十二):PostgreSQL 索引技术详解

    前面介绍了 PostgreSQL 数据类型和运算符、常用函数、锁操作、执行计划、视图与触发器、存储过程相关的知识点,今天将为大家介绍 PostgreSQL 索引 相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!! 索引主要被用来提升数据库性能,不当的使

    2024年02月04日
    浏览(87)
  • 【C#学习笔记】数组和索引器

    数组具有以下属性: 数组可以是一维、多维或交错的。 创建数组实例时,将建立纬度数量和每个纬度的长度。 这些值在实例的生存期内无法更改。 数值数组元素的默认值设置为0,而引用元素设置为 null。 交错数组是数组的数组,因此其元素为引用类型且被初始化为 null。

    2024年02月14日
    浏览(43)
  • 【前端进阶】-TypeScript高级类型 | 交叉类型、索引签名类型、映射类型

    前言 博主主页👉🏻蜡笔雏田学代码 专栏链接👉🏻【TypeScript专栏】 上篇文章讲解了TypeScript部分高级类型 详细内容请阅读如下:🔽 【前端进阶】-TypeScript高级类型 | 类的初始化、构造函数、继承、成员可见性 今天来学习TypeScript另外一些高级类型! 感兴趣的小伙伴一起来

    2023年04月08日
    浏览(38)
  • Mysql进阶优化篇02——索引失效的10种情况及原理

    前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 🍌 专栏简介:mysql基础、进阶,主要讲解mysql数据库sql刷题、进阶知识,包括索引、数据库调优、分库分表等 🌰 文章简介:本文将介绍索引失效的10种情况及原理,绝对不需要死记硬背,建议收

    2024年02月02日
    浏览(43)
  • 【C#进阶】C# 反射

    序号 系列文章 11 【C#基础】C# 预处理器指令 12 【C#基础】C# 文件与IO 13 【C#进阶】C# 特性 ✋ 大家好,我是writer桑,本章为大家介绍 C# 中的 反射 。 反射 指的是程序可以 访问,检测和修改 它本身状态或行为的一种行为。 其中访问的目标包括程序集 1 、模块和类型对象等。可

    2024年03月15日
    浏览(49)
  • 【C#进阶】C# 特性

    序号 系列文章 10 【C#基础】C# 正则表达式 11 【C#基础】C# 预处理器指令 12 【C#基础】C# 文件与IO 👍 大家好,我是writer桑,本章为大家介绍 C# 中的 特性 。 特性 (Attribute) 是用于在运行时传递程序中各种元素(比如类、方法、结构、组件等)的行为信息的 声明性标签 。可以使

    2024年02月02日
    浏览(31)
  • 【C#进阶】C# 事件

    序号 系列文章 15 【C#进阶】C# 属性 16 【C#进阶】C# 索引器 17 【C#进阶】C# 委托 🌍 hello大家好啊,我是哈桑。本文为大家介绍 C# 中的事件。 事件 本质上来讲是一种特殊的多播委托 1 ,只能从声明它的类中进行调用。事件通常用于表示用户操作,例如单击按钮或图形用户界面

    2024年02月07日
    浏览(40)
  • 【C#进阶】C# 属性

    序号 系列文章 12 【C#基础】C# 文件与IO 13 【C#进阶】C# 特性 14 【C#进阶】C# 反射 🌲 大家好,我是writer桑,本章为大家介绍 C# 中的 属性 。 属性 是 C# 中的重要成员。 属性和字段 1 类似,但属性提供了一种被称为访问器的灵活机制来 读取、写入或计算私有字段的值 。访问器

    2024年02月11日
    浏览(31)
  • C#使用MongoDB-第三章 索引的管理

    索引管理接口: IMongoIndexManagerTDocument 要进行集合索引的管理,需要获得 IMongoIndexManagerTDocument 实例对象,这个实例对象可以从集合对象的 Indexes 属性获取。 IMongoIndexManagerTDocument Indexes : IMongoCollectionTDocument 的实例方法,获取集合的索引管理对象。 索引的配置模型 CreateIndex

    2024年01月22日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包