C#中索引器Indexer的学习使用

索引器 顾名思义,是用来索引的,那么C#中索引器是用来索引什么的呢

首先我们知道,C#中的数组是本身就可以索引的,那么C#中的类和结构呢,类和结构的实例是无法索引的,如果我们想让C#中类或者结构的实例也可以像数组一样进行索引,这个就是需要索引器了。这也就是索引器的作用

索引器允许类或者结构的实例按照与数组相同的方式进行索引.  注意,是类或者结构的实例, 所以索引器不能用static来声明,索引器永远属于实例成员,因此不能声明为static

举个简单的类子

    /// <summary>
    /// 简单的索引器例子
    /// </summary>
    public class SimpleIndexExample
    {

        private string[] name = new string[2];


        //索引器必须以this关键字来定义,索引器中的this其实就是类实例化之后的对象,这是正确的理解方式
        public string this[int index]
        {

            get { return name[index]; }

            set { name[index] = value; }

        }

    }

    public class Program
    {

        static void Main(string[] args)
        {
            //索引器SimpleIndexExample的使用
            SimpleIndexExample myIndex = new SimpleIndexExample();

            //对索引器赋值
            myIndex[0] = "Luke";
            myIndex[1] = "Mike";

            //输出索引器的值
            Console.WriteLine(myIndex[0]);
            Console.WriteLine(myIndex[1]);
           

        }

    }

 这样看来,索引器是不是和数组特别像,其实不然,索引器和数组有很多的区别

区别1:  索引器的索引值(Index)类型不限定为整数; 我们知道,用来访问数组的索引值(Index)一定为整数,而索引器的索引值类型则可以为其他类型,不一定就是整数

区别2:     索引器允许重载, 一个类不限定为只能定义一个索引器,只要索引器的函数签名不同,就可以定义多个索引器,可以重载它的功能

区别3:  索引器不是一个变量,索引器没有直接定义数据存储的地方,而数组有,定义一个数组变量,它就是一个变量。而索引器不是,索引器具有Get和Set访问器.

索引器与属性也同样有区别,区别如下:

区别1  索引器以函数签名方式this来标识,而属性采用名称来标识,名称可以任意。

区别2  索引器可以重载,而属性不能重载

区别3   索引器必须是类或者结构的实例才有,所以不能用static来进行声明,它永远属于实例成员. 而属性可以使用static来进行声明.

 

    /// <summary>
    /// 以字符串为下标的索引器例子
    /// </summary>
    public class StringIndexExample
    {

        private Hashtable name = new Hashtable();


        //索引器以字符串为下标
        public string this[string index]
        {

            get { return name[index].ToString(); }

            set { name.Add(index, value); }

        }

    }

    public class Program
    {

        static void Main(string[] args)
        {
            //索引器StringIndexExample的使用
            StringIndexExample myIndex = new StringIndexExample();

            //对索引器赋值
            myIndex["A01"] = "Luke";
            myIndex["B01"] = "Mike";

            //输出索引器的值
            Console.WriteLine(myIndex["A01"]);
            Console.WriteLine(myIndex["B01"]);
           

        }

    }

 

下面举一个比较复杂的索引器的例子,上面的索引器无论参数是int类型还是string类型,索引器都只有一个参数。下面我们举一个例子,有两个参数的索引器,同时,对索引器进行重载

    /// <summary>
    /// 定义一个成绩实体类
    /// </summary>
         
    public class Scores
    {
        /// <summary>
        /// 学生姓名
        /// </summary>
        public string StuName { get; set; }

        /// <summary>
        /// 课程ID
        /// </summary>
        public int CourseId { get; set; }

        
        /// <summary>
        /// 分数
        /// </summary>
        public int Score { get; set; }

    }


    /// <summary>
    /// 查找成绩的类中,定义索引器
    /// </summary>
    public class FindScore
    {
        private List<Scores> listScores;

        public FindScore()
        {
            listScores = new List<Scores>();
        }

        //含有两个参数的索引器,通过学生姓名和课程编号来查找和保存成绩
        public int this[string stuName, int courseId]
        {
            get
            {
                Scores sResult = listScores.Find(s => s.StuName == stuName && s.CourseId == courseId);
                if (sResult != null)
                {
                    return sResult.Score;
                }
                else
                {
                    return -1;
                }

            }

            set
            {

                listScores.Add(new Scores() { StuName = stuName, CourseId = courseId, Score = value });

            }




        }

        public List<Scores> this[string stuName]
        {
            get
            {
                List<Scores> sListResult = listScores.FindAll(l => l.StuName == stuName);
                return sListResult;

            }
        }



        static void Main(string[] args)
        {

            //多参数索引器和索引器重载
            FindScore fScore = new FindScore();
            fScore["Luke", 1] = 90;
            fScore["Luke", 2] = 85;
            fScore["Luke", 3] = 95;
            fScore["Mike", 1] = 75;

            //查找Mike课程编号为1的成绩
            Console.WriteLine("The score of Mike in Course 1 is:" + fScore["Mike", 1]);

            //查找Luke所有课程的成绩
            List<Scores> LukeListScores = fScore["Luke"];

            if (LukeListScores.Count > 0)
            {
                foreach (Scores lukeS in LukeListScores)
                {
                    Console.WriteLine(string.Format("Luke 课程编号{0} 成绩为{1}", lukeS.CourseId, lukeS.Score));
                }
            }
            else
            {
                Console.WriteLine("没有该学生的成绩");
            }

        }


    }

 

本文参考 https://www.cnblogs.com/lxblog/p/3940261.html

posted on 2018-07-04 10:22  新西兰程序员  阅读(449)  评论(0编辑  收藏  举报