• C# 类中索引器的使用


      索引器(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(静态的)而索引器则必须是实例成员。

  • 相关阅读:
    递归算法详解
    树、森林和二叉树的转换
    C++ 类的静态成员详细讲解
    C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
    C++中的static关键字的总结
    C/C++中static关键字详解
    配置文件
    Spring Boot 注释
    使用 Spring Boot 快速构建 Spring 框架应用
    Myeclipse快捷键(二)
  • 原文地址:https://www.cnblogs.com/lgx5/p/9448361.html
Copyright © 2020-2023  润新知