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

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

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

相关推荐
信号处理学渣15 分钟前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客16 分钟前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
jasmine s25 分钟前
Pandas
开发语言·python
biomooc1 小时前
R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)
开发语言·r语言
骇客野人1 小时前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
black^sugar1 小时前
纯前端实现更新检测
开发语言·前端·javascript
404NooFound1 小时前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
用余生去守护2 小时前
python报错系列(16)--pyinstaller ????????
开发语言·python
数据小爬虫@2 小时前
利用Python爬虫快速获取商品历史价格信息
开发语言·爬虫·python
向宇it2 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎