C# 类中索引器的使用
发布日期:2021-09-11 05:52:42 浏览次数:27 分类:技术文章

本文共 5399 字,大约阅读时间需要 17 分钟。

  索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便、直观的被引用。索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。定义了索引器的类可以让您像访问数组一样的使用 [ ] 运算符访问类的成员。(当然高级的应用还有很多,比如说可以把数组通过索引器映射出去等等)

      本文只是简单演示一下索引器的概念和基本的使用方法:

请看代码,下面是类的定义,中间包含了一个索引器定义

class Program    {        static void Main(string[] args)        {            //声明并实例化这个类            Person p = new Person();            //使用索引器的方式来给类的两个属性赋值            p[0] = "jarod";            p[1] = "123456,./";            Console.WriteLine(p.Name);            Console.WriteLine(p.Password);            Console.ReadKey();        }    }    public class Person    {        //定义两个字段信息        private string name;        private string password;        //定义一个 Name 属性来操作 name 字段        public string Name        {            set { name = value; }            get { return name; }        }        //定义一个 Password 属性来操作 password 字段        public string Password        {            set { password = value; }            get { return password; }        }        //定义索引器,name 字段的索引值为 0 ,password 字段的索引值为 1        public string this[int index]        {            get            {                if (index == 0) return name;                else if (index == 1) return password;                else return null;            }            set            {                if (index == 0) name = value;                else if (index == 1) password = value;            }        }    }

C#索引器(一)

 

索引器允许类和结构的实例按照与数组相同的方式进行索引,索引器类似与属性,不同之处在于他们的访问器采用参数。被称为有参属性。

简单的索引器实例:

class Program    {        static void Main(string[] args)        {            IndexClass a = new IndexClass();            a[0] = "张三";            a[1] = "李四";            a[2] = "王五";            Console.WriteLine("a[0]=" + a[0]);            Console.WriteLine("a[1]=" + a[1]);            Console.WriteLine("a[2]=" + a[2]);            Console.ReadKey();        }    }    class IndexClass    {        private string[] name = new string[10];        public string this[int index]        {            get { return name[index]; }            set { this.name[index] = value; }        }    }

 

索引器与数组的比较:

索引器的索引值不受类型限制。用来访问数组的索引值一定是整数,而索引器可以是其他类型的索引值。

索引器允许重载,一个类可以有多个索引器。

索引器不是一个变量没有直接对应的数据存储地方。索引器有get和set访问器。

 

 

C#索引器(二)

 

索引器允许类和结构的实例按照与数组相同的方式进行索引,索引器类似与属性,不同之处在于他们的访问器采用参数。被称为有参属性。

简单的索引器实例:

索引器与属性的比较:

标示方式:属性以名称来标识,索引器以函数签名来标识。

索引器可以被重载。属性则不可以被重载。

属性可以为静态的,索引器属于实例成员,不能被声明为static

多参数索引器实例:

class Program    {        static void Main(string[] args)        {            ScoreIndex s = new ScoreIndex();            s["张三", 1] = 90;            s["张三", 2] = 100;            s["张三", 3] = 80;            s["李四", 1] = 60;            s["李四", 2] = 70;            s["李四", 3] = 50;            Console.WriteLine("张三课程编号为1的成绩为:" + s["张三", 1]);            Console.WriteLine("张三的所有成绩为:");            ArrayList temp;            temp = s["张三"];            foreach (IndexClass b in temp)            {                Console.WriteLine("姓名:" + b.Name + "课程编号:" + b.CourseID + "分数:" + b.Score);            }            Console.ReadKey();        }        class IndexClass        {            private string _name;            private int _courseid;            private int _score;            public IndexClass(string _name, int _courseid, int _score)            {                this._name = _name;                this._courseid = _courseid;                this._score = _score;            }            public string Name            {                get { return _name; }                set { this._name = value; }            }            public int CourseID            {                get { return _courseid; }                set { this._courseid = value; }            }            public int Score            {                get { return _score; }                set { this._score = value; }            }        }        class ScoreIndex        {            private ArrayList arr;            public ScoreIndex()            {                arr = new ArrayList();            }            public int this[string _name, int _courseid]            {                get                {                    foreach (IndexClass a in arr)                    {                        if (a.Name == _name && a.CourseID == _courseid)                        {                            return a.Score;                        }                    }                    return -1;                }                set                {                    arr.Add(new IndexClass(_name, _courseid, value)); //arr["张三",1]=90                }            }            //重载索引器            public ArrayList this[string _name]            {                get                {                    ArrayList temp = new ArrayList();                    foreach (IndexClass b in arr)                    {                        if (b.Name == _name)                        {                            temp.Add(b);                        }                    }                    return temp;                }            }        }    }

备注:

所有索引器都使用this关键词来取代方法名。Class或Struct只允许定义一个索引器,而且总是命名为this。 

索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。 
get 访问器返回值。set 访问器分配值。 
this 关键字用于定义索引器。 
value 关键字用于定义由 set 索引器分配的值。 
索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。 
索引器可被重载。 
索引器可以有多个形参,例如当访问二维数组时。 
索引器可以使用百数值下标,而数组只能使用整数下标:如下列定义一个String下标的索引器 
public int this [string name] {...} 
属性和索引器 
属性和索引器之间有好些差别: 
类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。 
属性可以是static(静态的)而索引器则必须是实例成员。

 

转载地址:https://blog.csdn.net/weixin_34406061/article/details/86008177 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:image_pyradid和自己的一些训练经验总结
下一篇:https://leetcode-cn.com/

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月30日 03时40分03秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章