C#中的索引器

  • Post author:
  • Post category:其他



最近看面试题也好,敲手头书上的例子也好,都让我看到了索引器这个概念,原来没有接触过,今天就来看看什么是C#中的索引器


索引器允许类或结构的实例就像数组一样进行索引。


索引器类似于属性,不同之处在于他们的取值函数采用参数



用在哪里



索引器经常是在主要用于封装内部集合或数组的类型中实现的。假如,假定具有一个名为TempRecord的类,此类表示在24小时内的10个不同时间记录的华氏温度。此类包含一个表示温度的Float类型的名为“temps”的数组和表示记录温度的日期的DateTime


通过在此类中实现一个索引器,客户端可以通过float temp=tr[4]而不是float temp=tr.temps[4]语法访问此类实例出对象的温度



语法结构

:声明类或结构上的索引器,要使用this关键字

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



Demo



    /// <summary>
    /// 最简单的索引器
    /// </summary>
    public class Person
    {
        //声明私有数组
        private string[] hero = new string[5] { "老白","小粉" , "炸鸡哥", "空姐", "Hank" };

        public int Length
        {
            get { return hero.Length; }
        }

        //声明索引
        public string this[int index] 
        {
            get 
            {
                return hero[index];
            }
            set
            {
                hero[index] = value;
            }
        }


        class Program
        {
            static void Main(string[] args)
            {
                Person breakingbad = new Person();
                //使用索引器设置值
                breakingbad[3] = "谢耳朵";
                breakingbad[4] = "潘妮";

                //使用索引器获得值
                for (int i = 0; i < 5; i++)
                {
                    System.Console.WriteLine("元素 #{0} = {1}", i, breakingbad[i]);
                }
                System.Console.WriteLine("Press any key to exit.");
                System.Console.ReadKey();
            }
        }

    }

这里写图片描述



索引器和属性的比较




1.相同点


  • 1).索引和属性都不用分配内存位置来存储。


  • 2).索引和属性都是为类的其它成员提供访问控制的。


  • 3).索引和属性都有get访问器和set访问器,它们可以同时声明两个访问器,也可以只声明其中一个。



2.不同点


  • 1).属性通常表示单独的数据成员,而索引表示多个数据成员。

  • 2).属性既可以声明为实例属性,也可以声明为静态属性,而索引不能声明为静态的。

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

  • 4).get访问器:属性的 get 访问器没有参数,索引器的 get 访问器具有与索引器相同的形参表。

  • 5).set访问器:属性的 set 访问器包含隐式 value 参数。除了值参数外,索引器的 set 访问器还具有与索引器相同的形参表。



版权声明:本文为cd18333612683原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。