首页 > 编程语言 >理解 C# 中的索引器(Indexer)详解与示例

理解 C# 中的索引器(Indexer)详解与示例

时间:2024-07-30 20:27:48浏览次数:18  
标签:index 示例 C# Indexer 索引 int new public row

文章目录


在这里插入图片描述

在 C# 中,索引器(Indexer)是一种特殊的属性,允许类的实例像数组一样通过索引访问。索引器使得可以定义类似于数组的访问方式,但是访问的对象可以是类的实例,而不仅限于数组。

1. 索引器的基本概念

索引器允许通过类实例的索引来访问该类的实例成员。它的声明类似于属性,但具有参数。通常情况下,索引器用于允许类的实例像数组一样通过索引进行访问。

2. 索引器的语法

索引器的语法如下所示:

public class MyClass
{
    // 声明一个索引器
    public returnType this[indexType index]
    {
        get
        {
            // 返回索引位置的值
        }
        set
        {
            // 设置索引位置的值
        }
    }
}
  • returnType: 索引器返回的数据类型,可以是任意有效的 C# 数据类型。
  • indexType: 索引的参数类型,可以是整数、字符串或其他合法类型。
  • get: 获取索引位置的值的访问器。
  • set: 设置索引位置的值的访问器。

3、索引器示例

下面通过一个简单的示例来演示如何定义和使用索引器。

3.1. 定义一个简单的索引器

首先,我们定义一个名为MyCollection的类,包含一个私有的数组和一个索引器。

public class MyCollection
{
    private int[] items = new int[10];

    public int this[int index]
    {
        get
        {
            if (index >= 0 && index < items.Length)
            {
                return items[index];
            }
            else
            {
                throw new ArgumentOutOfRangeException("index");
            }
        }
        set
        {
            if (index >= 0 && index < items.Length)
            {
                items[index] = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("index");
            }
        }
    }
}

3.2. 使用索引器

接下来,我们创建MyCollection类的实例,并通过索引器访问和修改内部数组元素。

class Program
{
    static void Main(string[] args)
    {
        MyCollection collection = new MyCollection();

        // 通过索引器设置元素值
        collection[0] = 1;
        collection[1] = 2;
        collection[2] = 3;

        // 通过索引器获取元素值
        for (int i = 0; i < 3; i++)
        {
            Console.WriteLine(collection[i]);
        }
    }
}

运行程序,输出结果如下:

1
2
3

4、索引器进阶

4.1. 多维索引器

C#索引器可以支持多维索引,如下所示:

public class Matrix
{
    private int[,] items = new int[3, 3];

    public int this[int row, int col]
    {
        get
        {
            if (row >= 0 && row < 3 && col >= 0 && col < 3)
            {
                return items[row, col];
            }
            else
            {
                throw new ArgumentOutOfRangeException("row or col");
            }
        }
        set
        {
            if (row >= 0 && row < 3 && col >= 0 && col < 3)
            {
                items[row, col] = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("row or col");
            }
        }
    }
}

4.2. 索引器重载

C#允许对索引器进行重载,如下所示:

public class MyCollection
{
    private int[] items = new int[10];
    private string[] strings = new string[10];

    public int this[int index]
    {
        get
        {
            // ...
        }
        set
        {
            // ...
        }
    }

    public string this[string key]
    {
        get
        {
            // ...
        }
        set
        {
            // ...
        }
    }
}

5. 索引器的注意事项

  • 索引器可以具有多个参数,但每个参数的类型必须唯一。
  • 索引器的参数可以是值类型或引用类型。
  • 可以根据需要只声明 get 或 set 访问器,但至少必须实现其中一个。

6. 总结

索引器是 C# 中一个强大且灵活的特性,允许类的实例像数组一样通过索引来访问。它提供了一种简洁、直观的方式来管理类的实例数据,特别适用于需要按照索引方式进行访问和修改的场景。

通过本文的介绍和示例,希望读者能够理解并掌握 C# 中索引器的使用方法和基本原理,从而能够在实际项目中灵活运用。

标签:index,示例,C#,Indexer,索引,int,new,public,row
From: https://blog.csdn.net/qq_35320456/article/details/140781082

相关文章

  • TCP为什么需要四次挥手?
    tcp为什么需要四次挥手?答案有两个:1.将发送fin包的权限交给被动断开方的应用层去处理,也就是让程序员处理2.接第一个答案,应用层有了发送fin的权限,可以在发送fin前继续向对端发送消息为了搞清楚这个问题,我们先要了解四次挥手的过程:1.注意事项tcp四次挥手过程中没有客户......
  • 7 .30 ACM总结
    放假前几天,老师让我们打一场ACM来放松一下(非常好,放松不一定,被压力了)C题C题是个非常水的搜索题,队友看一眼就秒了。写的时候出了一点小问题,但也调出来了,此时我们来到了第6(总共7队)。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e3+5;......
  • CF538H Summer Dichotomy 题解
    Description有\(T\)名学生,你要从中选出至少\(t\)人,并将选出的人分成两组,可以有某一组是空的。有\(n\)名老师,每名老师要被分配到两个小组之一,对于第\(i\)名老师,要求所在的小组中的学生人数\(\in[l_i,r_i]\)。此外,有\(m\)对老师不能在同一个小组中。你需要判断能否......
  • Android开发 - List类中的CopyOnWriteArrayList实现类解析
    CopyOnWriteArrayList是什么CopyOnWriteArrayList是Java并发包(java.util.concurrent)中的一个并发安全的List实现类。它具有特定的设计,使得在并发场景下,读操作(如迭代)可以并发进行,而写操作(如添加、修改、删除)会进行一定的同步,但不会阻塞读操作主要特点和用法:线程安全......
  • python高性能计算:cython入门代码
    三种实现的对比:(1)纯pythonx.pydefis_prime(num):forjinrange(2,num):if(num%j)==0:returnFalsereturnTrueimporttimea=time.time()foriinrange(10,100000):is_prime(i)b=time.time()print(b-a)(2)x2.py......
  • SP8099 TABLE - Crash´s number table 题解
    题目传送门前置知识一般的积性函数|数论分块|莫比乌斯反演解法令\(n\lem\)。考虑莫比乌斯反演,推式子,有\(\begin{aligned}&\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\operatorname{lcm}(i,j)\\&=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\frac{ij}{\gcd(i,j)......
  • 《NET CLR via C#》---第三章("运行时"解析类型引用)
    "运行时"解析类型引用首先在"C:\Users\LH89\source\repos"目录下,新建Console1工程(C#控制台)实现简单的代码,并编译为程序集(假定名为Program.exe)usingSystem;publicclassProgram{staticvoidMain(string[]args){Console.WriteLine("HelloWorld"......
  • c语言笔记(2024.7.24)第三天
    常量与变量概念:·表面:程序运行过程中取值可以改变的数据·实际:变量其实代表了一块内存区域/单元/空间。变量名可视为该区域的标识。整个变量分为三部分:·变量名:这个只是变量的一个标识,我们借助变量名来存取数据。·变量空间/存储单元:这个就是内存中分配的一块用来存放......
  • 嵌入式初学-C语言-练习二
    #针对于前六篇学习所出习题,题型内容均为本人敲写,若有不合理,或逻辑重复,请多多包涵,也请大家指点!!#1、通过键盘输入一个年份,判断是不是润年,是显示“是润年”,否则显示“不是润年”#include<stdio.h>intmain(){unsignedintyears;printf("输入一个年份\n");scanf("%d......
  • c语言(单,双,三分支)swich的运算
    分支结构分支结构:又被称之为选择结构概念选择结构:根据条件成立与否,选择相应的操作。条件构建关系表达式:含有关系运算符的表达式(>,<,>=,<=,!=,==)逻辑表达式:含有逻辑运算符的表达式(&&,||,!),往往是用来构建复杂的复合条件,比如:if(year%100==0&&year%4!=0)//这种......