C#索引器的实现、索引器和属性的异同对比,这些技能你get到了嘛?

2020-09-23 11:08:57 浏览数 (1)

Hello!大家好,我是努力赚钱买生发水的灰小猿!

最近在用C#做开发的时候要用到索引函数,所以今天就在这里和小伙伴记录一下C#中索引器的实现。

什么是索引器?

在C#中,索引器允许类或结构的实例按照和数组相同的方式进行索引,索引器类似于属性,不同之处在于他们的访问采用参数,而实际上,索引器提供了一种访问类或结构的方法,即允许按照和类、结构或接口相同的方式进行索引,它的引入的目的是为了让程序更加的直观便于理解。

如何声明索引器?

索引器提供了一种特殊的方法,来对类或结构体中的对象进行赋值和访问,要在类或结构上声明索引器,需要使用this关键字,索引器的定义格式如下:

代码语言:javascript复制
[修饰符] 数据类型 this[索引类型 index]
{
    get{//获得属性的代码}                                                 
    set{ //设置属性的代码}
}

其中修饰符包括:public,protected,private,internal,new,virtual,sealed,override,abstract,extern.

数据类型是表示将要存取的数组或集合元素的类型,如string、int等。

this关键字引用当前类的实例,从中可以看到,对索引器和对普通属性一样,为它提供set和get访问器,这些访问器指定使用该索引器时将引用什么内部成员。

索引器类型表示该索引器使用哪一类型的索引来存取数组或集合元素,可以是整数同时也可以是字符串。

索引器和属性的异同对比

在定义上,索引器和属性相似,具有如下的相似点:

  • 它们都属于函数成员,都不用分配内存来存储。
  • 它们都主要用来被访问其他数据成员,与这些数据成员相关联,并且为这些成员提供获取和设置访问。

索引器和属性的区别如下:

  • 属性允许调用方法,如同它们是公共数据字段,索引器允许调用对象的方法,如同对象是一个数组。
  • 属性可以通过简单的名称进行访问,索引器可以通过索引器进行访问。
  • 属性可以作为静态成员或实例成员,索引器必须作为实例成员。
  • 属性的get访问器没有参数,索引器的get访问器具有和索引器相同的形参表。
  • 属性的set访问器包含隐藏value参数,索引器的set访问器除了value参数外,还具有和索引器相同的形参表。

索引器实例分析

比如下面这个程序,

定义一个课程类Couse,在该类中定义三个私有成员Chinese、English、Math,通过索引函数访问该类的私有成员,并对这三个私有成员进行读写操作。

首先是定义Couse类,并在该类中实现索引器:

代码语言:javascript复制
//定义类Couse
class Couse
{
//定义私有成员变量
        private float Chinese;
        private float English;
        private float Math;

//定义索引器,该索引器的修饰符是public,数据类型是float,索引类型是string
        public float this[string name]
        {
//定义get方法对成员进行读取
            get
            {
                switch (name)
                {
                    case "语文":
                        return Chinese;                     
                    case "英语":
                        return English;                       
                    case "数学":
                        return Math;      
                    default:
                        return 0;                   

                }
            }

//定义set方法对成员进行写入
            set
            {
                switch (name)
                {
                    case "语文":
                        Chinese = value;
                        break;
                    case "英语":
                        English = value;
                        break;
                    case "数学":
                        Math = value;
                        break;

                }
            }
        }
    }

在主类中调用Couse类和索引器,对成员变量进行读写:

代码语言:javascript复制
class Program

    {
        static void Main(string[] args)
        {
            //新建一个对象接收Couse类
            Couse couse = new Couse();
            couse["语文"] = 100;  //通过“语文”索引对Chinese进行赋值
            couse["英语"] = 99;   //通过“英语”索引对English进行赋值
            couse["数学"] = 98;   //通过“数学”索引对Math进行赋值

            //通过相应的索引获取到成员的值并输出
             Console.WriteLine("语文:"   couse["语文"]);
             Console.WriteLine("英语:"   couse["英语"]);
             Console.WriteLine("数学:"   couse["数学"]);
        }
    }

运行结果如下:

在上述程序中首先在定义Couse类并在其中设置索引器,之后在主方法中调用该类,并通过索引对成员变量进行赋值,之后再通过索引对相应的成员变量进行调用。

好了,内容不多也好理解。

觉得不错记得点赞关注大灰狼哟!

0 人点赞