C#核心(7)索引器

前言

上一节我们讲解了非常晕脑袋的成员属性,不知道各位有没有下去好好练习,但是时间不等人,我们继续来讲封装相关的索引器。索引器相对来说会简单很多,大家放轻松。

在C#中,索引器(Indexer)是一种特殊的属性(Property)类型,允许我们通过类似于数组的方式访问一个类的实例。它允许我们定义一个类的实例的集合,并且可以像访问数组一样使用索引的方式访问集合中的元素。

索引器实际上是一种定义在类中的特殊方法,它允许我们通过类似于数组的方式使用特定的参数访问类的实例。通过使用索引器,我们可以像访问数组元素一样访问类中的一组相关元素。

索引器可以有一个或多个参数,并且可以是任何合法的数据类型。我们可以定义不同类型的索引器以提供不同的访问方式。索引器可以具有get和set访问器,允许我们在类的外部获取和设置索引器的值。

基本概念

让对象可以向数组一样通过索引访问其中元素,使程序看起来更直观,更容易被编写

为什么要有这个东西,简单举个例子,你如果开发了一个社交游戏,肯定好友不止一个,好友我们可以看做是这个玩家的一个属性,那我们就需要索引器来帮助我们了。

索引器语法

cs 复制代码
访问修饰符 返回值 this[参数类型 参数名,参数类型 参数名...]
{
    内部的写法和规则同成员属性
    get{}
    set{}
}

例子和使用

我们还是用游戏社交来举例子,这是得到我的游戏好友。

c# 复制代码
class GameSocial
{
    private string[] members;
    
    public GameSocial(int size)
    {
        members = new string[size];
    }
    
    // 索引器
    public string this[int index]
    {
        get { return members[index]; }//你可以在这里写逻辑,进行一些操作
        set { members[index] = value; }
    }
    
    public int Length
    {
        get { return members.Length; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        GameSocial gameSocial = new GameSocial(10);//假设我有十个好友
        
        // 添加成员名单
        gameSocial[0] = "Alice";//给他们命名,当然你可以给他们其他的值
        gameSocial[1] = "Bob";
        gameSocial[2] = "Charlie";
        
        // 获取成员名单
        for (int i = 0; i < gameSocial.Length; i++)
        {
            Console.WriteLine(gameSocial[i]);
        }
    }
}
 

当然,你可能也会有成员属性和成员变量一样的困惑,这不跟直接在类里弄一个数组道理是一样的吗?

这里郑重声明:直接给类中的数组赋值是简单快捷的方法,但会共享相同的内存位置,可能会导致意外的副作用。通过索引器给数组赋值则提供了更多的控制和灵活性,但相对来说更复杂一些。取决于具体的需求和场景,选择合适的方法来赋值。

通过索引器给数组赋值是通过对类的索引器进行调用来修改数组元素的值。在索引器的实现中,你可以对传入的索引执行一些辅助逻辑。这意味着你可以在设置数组元素之前进行一些验证或转换操作。此外,通过索引器赋值是在使用特定的语法和方法来修改数组元素,这可以提供更多的灵活性和控制。

索引器中可以写逻辑!(报错处理等)

索引器可以重载(处理不同参数的传入)

总结

索引器的这一块其实就是一个拆解开的数组逻辑处理,我们可以在赋值的时候进行更多我们自己想进行的操作,其实在你学完成员属性和成员变量后,这一块就相对简单了。

当然,最主要的还是你自己多敲代码,这些东西可能再unity初期开发当中使用较少,但是它不可避免,所以务必脚踏实地好好学习。

请期待我的下一篇文章!共勉!

我来自佑梦游戏开发,欢迎你的关注和订阅!

相关推荐
IT笔记1 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
逝水无殇1 小时前
C# 运算符重载详解
开发语言·后端·c#
TPBoreas2 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言
敲代码的嘎仔2 小时前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
江华森2 小时前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python
杜子不疼.2 小时前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式
开发语言·数据库·qt
老迟到的茉莉4 小时前
Hermes 是谁?跟 Claude Code 差在哪
开发语言·python
学逆向的4 小时前
汇编——内存
开发语言·汇编·算法·网络安全
lbb 小魔仙4 小时前
MuMu 模拟器 6.0 硬核测评:这次升级确实不一样
java·开发语言·模拟器·mumu·硬核测评
r_oo_ki_e_4 小时前
Java 线程池
java·开发语言