索引器与数组的区别(详解)

来源:互联网 发布:木秀于林风必助之知乎 编辑:程序博客网 时间:2024/06/05 11:20

索引器与数组的比较:

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

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

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

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

简单的索引器实例:

索引器与属性的比较:

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

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

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

多参数索引器实例:

using System;

using System.Collections.Generic;

using System.Text;

using System.Collections;

namespace Study

{

   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 = newArrayList();

                foreach (IndexClass b in arr)

                {

                    if (b.Name == _name)

                    {

                        temp.Add(b);

                    }

                }

                return temp;

           }

       }

    }

}

备注:

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

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

get 访问器返回值。set 访问器分配值。

this 关键字用于定义索引器。

value 关键字用于定义由 set 索引器分配的值。

索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。

索引器可被重载。

索引器可以有多个形参,例如当访问二维数组时。

索引器可以使用百数值下标,而数组只能使用整数下标:如下列定义一个String下标的索引器

public int this [string name] {...}

属性和索引器

属性和索引器之间有好些差别:

类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。

属性可以是static(静态的)而索引器则必须是实例成员。

 

 

摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/kf/201010/76539.html

原创粉丝点击