C#中的索引器——双重索引器

       我们都知道C#中的索引器,它为我们访问类中的集合或数组类型的成员提供了方便。假如有一个类CS1,该类有一个集合成员AList。我们通过CS1的索引器(假如它有的话)就可以访问AList集合中的元素。即CS1obj[index](CS1obj是类CS1的一个实例)对应的就是AList[index]元素。

       现在我们变通一下:假如AList集合中的各元素是另一个嵌套定义在CS1中的类CS2的实例。而CS2也有一个数组成员Array,并且CS2还有一个索引器用来访问该数组的元素。那么我们知道通过CS2obj[index](CS2obj是类CS2的实例)就可以访问Array[index]元素。

       我们知道CS2obj是集合AList中的元素,而集合AList又是类CS1的成员。那么我通过CS1obj[index]可以访问AList[index]元素,也即访问到了CS2的一个实例,那么通过该实例的索引器是不是就可以访问到数组Array[]中的元素呢。即

                CS1obj[index][index2]是不是就是Array[index2]的元素呢?

        下面一个程序证明是可以的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace 索引指示器示例
{
    class CS1
    {
        ArrayList CS2List = new ArrayList();               //定义一个集合
        public CS1()                                                        //CS1的构造函数,用来初始化集合CS2List
        {                                                                          //使CS2List中的成员都是类CS2的实例
            for (int i = 0; i < 3; i++)
                CS2List.Add(new CS2());
        }
        public class CS2                                                  //类CS2,嵌套定义在CS1中,注意该类必须是public的,否则会显示错误
        {                                                                          //信息:返回类型与索引器不一致。
            int [] my=new int[5];
            public CS2()                                                   //类CS2的构造函数,用来初始化my[]数组。
            {
                for (int i = 0; i < 5; i++)
                    my[i] = i;
            }
            public int this[int index]                                 //类CS2的索引器,返回my[]数组中的元素
            {
                get
                {
                    return my[index];
                }
            }
        }
        public CS2 this[int index]                                 //CS1的索引器,返回集合CS2List中的元素,也就是说返回CS2类型的一个引用
        {
            get                                                                 //所以你如果把CS2定义为private类型,在这里就会给出一个编译错误:
            {                                                                   //返回类型比索引器可访问级别地
                return (CS2)CS2List[index];
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            CS1 how = new CS1();
            for (int i = 0; i < 3; i++)
                for (int j = 0; j < 5; j++)
                    Console.WriteLine(how[i][j]);            //访问CS1.CS2List[i].my[j]的值(当然在程序中不能这么写,这里是为了说明)
            Console.ReadKey();
        }
    }
}

发布了13 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xsff1024/article/details/2860426