当前位置: 首页 > article >正文

C#核心(7)索引器

前言

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

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

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

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

基本概念

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

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

索引器语法

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

例子和使用

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

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初期开发当中使用较少,但是它不可避免,所以务必脚踏实地好好学习。

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

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


http://www.kler.cn/a/385250.html

相关文章:

  • Android OpenGL ES详解——纹理过滤GL_NEAREST和GL_LINEAR的区别
  • Flutter 中的那些设计模式的写法(持续更新)
  • RDD转换算子:【map】
  • 如何快速搭建一个spring boot项目
  • 美格智能5G车规级通信模组:高精度定位守护极致安全
  • 推荐一款基于Flash的交互式园林设计工具:Garden Planner
  • 从0开始linux(21)——文件(2)文件重定向
  • Hive 查询各类型专利 Top 10 申请人及对应的专利申请数
  • 记录offcanvas不能显示和关闭的修复方法
  • QT监控文件夹变化(文件增加、删除、改名)
  • B2C分销管理系统(源码+文档+部署+讲解)
  • C++20 STL CookBook 4:使用range在容器中创建view
  • c# 动态lambda实现二级过滤(多种参数类型)
  • 『VUE』21. 组件注册(详细图文注释)
  • Kubernetes时代的APM部署革新:基于Webhook的Agent动态注入
  • docker镜像文件导出导入
  • GPU服务器厂家:AI 赋能科学研究的创新突破
  • 1.每日SQL----2024/11/7
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30
  • 为什么人工智能增强的威胁和法律不确定性成为风险主管最关心的问题
  • 5G智能对讲终端|北斗有源终端|北斗手持机|单兵|单北斗
  • Java | Leetcode Java题解之第543题二叉树的直径
  • 关于遥感影像BIL、BIP、BSQ你知道多少?给一个二进制文件你会读取嘛~
  • uniapp使用腾讯即时通讯IM(复制即可使用)
  • 小白初入Android_studio所遇到的坑以及怎么解决
  • Java I/O流面试之道