《随笔四》——C#中的 “ 索引器和属性的相同点和不同点、索引器与数组的区别、索引器的重载 ”

目录

索引器和属性的相同点和不同点

索引器与数组的区别

索引器的重载


关于索引器的详细请看这里《随笔三》——C#中的“ 索引器”  https://blog.csdn.net/qq_34536551/article/details/83926260


索引器(Indexer)


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

定义索引器的方式与定义属性有些类似,其一般形式如下:

[修饰符] 索引器类型 this[索引值类型 index]
{
    get{//获得属性的代码}                                                 
    set{ //设置属性的代码}
}

修饰符包括: public, protected, private, internal, new, virtual, sealed, override,  abstract,  extern.

索引器类型是表示将要存取的数组或集合元素的类型。

索引值类型表示该索引器使用哪一类型的索引来存取数组或集合元素,可以是整数,可以是字符串;this表示操作本对象的数组或集合成员,可以简单把它理解成索引器的名字,因此索引器不能具有用户定义的名称。

 


索引器和属性的相同点和不同点


相同点:

●   索引器是一组get 和 set 访问器, 与属性类类似。

● 索引器和属性有很多相似的:

和属性一样,索引器不用分配内存来存储。

索引器和属性都主要被用来访问其它数据成员, 它们与这些成员数据相关联,并可以提供读取和写入。

 

和属性一样,索引器可以只有一个访问器,也可以两个都有。

和属性一样,实现get 和 set 访问器的代码不必一定要关联到某个字段和 属性。 这段代码可以做任何事情或者什么都不做。 只要get访问器返回某个指定类型的值既可。

 

 

不同点:

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

索引器可以重载,而属性不能重载。

属性既可以声明为实例属性,也可以声明为静态属性,索引器永远属于实例成员,因此不能声明为static。

属性有简洁的自动实现属性,而索引必须声明完整。

 

索引器中参数列表中“ [ ]”必须至少声明一个参数。

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

属性通常操作一个数据成员。索引器通常可以操作多个数据成员。

说明: 我们可以认为索引器是为类的多个数据成员提供get 和 set 的属性,通过索引器,我们可以操作许多可能的数据成员。  那么索引器本身可以是任何类型,不仅仅是数值类型。


索引器与数组的区别


索引器的索引值(Index)类型不限定为整数:

        用来访问数组的索引值(Index)一定为整数,而索引器的索引值类型可以定义为其他类型。

索引器允许重载

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

索引器不是一个变量

        索引器没有直接定义数据存储的地方,而数组有。索引器具有get和set访问器。

 


索引器的重载


●   只要索引器的参数列表不同, 类就可以有人任意多个索引器。 仅仅是索引器类型不同是不行的。 这称为索引器重载。

namespace Ch05Ex03
{
    //定义一个能被索引的类  
    class Classes

    {//对类的索引实质是对类中数组的索引  

        public string[] StudentName = new string[6];

        //定义索引器  

        public string this[int ID]

        {
            get
            {
                if (ID < 6)
                {
                    return StudentName[ID];
                }
                return null;
            }
            set
            {//set访问器自带value参数  
                if (ID < 6)
                {
                    StudentName[ID] = value;
                }
            } 
        }

        //重载索引器参数设为string类型  
        public uint this[string name]

        {
            get

            { //找到与name匹配的学号  

                uint index = 1;

                while (StudentName[index] != name && index < 6)

                { index++; }

                return index;
            }
            set { }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Classes class4 = new Classes();
            //索引写入  
            for (int i = 1; i < 6; i++)

            {
                class4[i] = "HC" + i;

            }
            //索引读出,通过学号索引出姓名  
            for (int j = 1; j < 6; j++)
            {
               WriteLine(j + "号\t" + class4[j]);
            }
            //通过姓名索引出学号  
            for (int k = 1; k < 6; k++)
            {
                string name = "HC" + k;
                Console.WriteLine(name + "\t" + class4[name] + "号");//对比上面用法一样参数不一样              
            }
              ReadKey();
        }
    }
}

输出结果为:

1号     HC1
2号     HC2
3号     HC3
4号     HC4
5号     HC5
HC1     1号
HC2     2号
HC3     3号
HC4     4号
HC5     5号

 

你可能感兴趣的:(C#中的随笔)