如何理解C#索引器

1 索引器定义

  首先看看索引器的本质:索引器是一个存在于结构中的形式相似于属性(对字段的封装)的特殊方法
  索引器是实例化方法(不可定义为静态static,它属于对象),拥有get与set访问器。其中get访问器具有和索引器相同的形参表,set访问器具有和索引器相同的形参表+value。说白了:索引器就是属性加强版本——它可将多个字段(普通变量,或者数组、顺序表等集合)同时进行封装,而属性只能对一个字段进行封装!
  索引器定义(声明)的格式如下

修饰符 数据类型 this[索引类型 index]
{
	set //参数:index,value
    {
    	设置代码;
    }
    get //参数:index
    {
    	获取代吗;
    }
}

2 索引器与数组、属性的区别

2.1 索引器与数组

索引器数组
索引器下标无限制(int,string,…)数组下标必须是int型
索引器是类/结构中的一个成员,允许成员重载数组不能重载
索引器是一种特殊方法数组是自定义引用类型变量

2.2 索引器与属性

索引器属性
索引器主要是对类中数组、集合的封装属性主要是对类中的字段封装
对象如同是一个数组属性如同是字段
索引器必须为实例成员;访问:对象名[索引]属性可为静态成员或实例成员;访问:类名.属性、对象名.属性
索引器可以重载属性不能重载(参数都没有!)
get访问器具有同索引器相同的形参get访问器无参数
除value外,set访问器还具有索引器形参set访问器隐含value参数

3 示例代码

3.1 索引器封装多个字段

public class CourseGrade
    {
        //索引器封装多个字段
        private float Chinese = 95;
        private float Math = 100;
        private float English = 93;
        public float this[int index]
        {
            set
            {
                //多个字段,以switch来选择
                switch (index)
                {
                    case 0: Chinese = value; break;
                    case 1: Math = value; break;
                    case 2: English = value; break;
                    default: Console.Write("超出索引!"); break;
                }
            }
            get
            {
                switch (index)
                {
                    case 0: return Chinese;
                    case 1: return Math;
                    case 2: return English;
                    default: throw new ArgumentOutOfRangeException();
                }
            }
        }
    }
    class SomePlace
    {
        static void Main(string[] args)
        {
            CourseGrade cg = new CourseGrade();
            cg[0] = 99;
            cg[1] = 100;
            cg[2] = 95;
            //cg[3] = 99;//超出索引
            Console.WriteLine("语文:{0},数学:{1},英语:{2}", cg[0], cg[1], cg[2]);
            Console.ReadKey();
        }
    }

3.2 索引器封装数组

class Student //internal
    {
        //类中:数组、集合等的封装
        private string[] stuName = new string[20];
        private string[] stuNum = new string[20];
        //索引器—"对象数组":对象为数组名;索引为int、string等
        public string this[int n,string index]//this→对象
        {
            set //参数n,index(name,num),value
            {
                if (index == "name") stuName[n] = value;
                else if (index == "num") stuNum[n] = value;
            }
            get //参数n,index(name,num)
            {
                if (index == "name") return stuName[n];
                else if (index == "num") return stuNum[n];
                else return "Unknown";
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Student st = new Student();
            st[0, "name"] = "杨**";st[0, "num"] = "2014301610498";
            st[1, "name"] = "涂**";st[1, "num"] = "2020301610234";
            for(int i=0; i<2; i++)
            {
                Console.WriteLine("姓名:{0};学号:{1}", st[i, "name"], st[i, "num"]);
            }
            Console.ReadKey();
        }
    }

参考文献

  [1] 李军.面向对象和组件的C#编程[M].北京:科学出版社,2013.
  [2] 刘春茂,李琪.C#程序开发案例课堂[M].北京:清华大学出版社,2018.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_xxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值