《.NET程序员面试秘笈》----面试题13 举例说明索引器的作用

面试题13 举例说明索引器的作用

.NET程序员面试秘笈
【考点】索引器的理解,this在索引器中的作用。

【出现频率】

【解答】

索引器可以使客户程序很方便地访问类中的集合或数组,访问方法类似于通过索引访问数组,并且索引器向客户程序隐藏了内部的数据结构。索引器和属性同样使用get和set访问器读取、写入值,不过索引器的get和set访问器必须具有与索引器相同的形参表。但是属性可以为静态成员,而索引器必须为实例成员。索引器不支持类似于属性的自动实现的语法。

说明:

形参表即为声明索引器时接收的形式参数。
本例描述了索引器在类中的具体应用,其参数可为整型、字符串等类型,也可为多个(如索引多维数组)。在ch01目录下新建一个程序文件,并命名为Index.cs,编写代码如程序1.14所示。

程序1.14 索引器示例:Index.cs

  using System;
  class Index
  {
    static void Main()
    {
      Console.WriteLine("我的暑假安排:");
      Plan p = new Plan();            //创建Plan类型的实例p
      for (int i = 0; i < p.Length; i++)     //从0到days数组元素个数的循环
      {
        Console.Write("+" + p[i] + "\t+");   //输出days数组的元素值
        Console.Write(p[p[i]] + "\n");     //输出content数组的元素值
      }
    }
  }
  class Plan       //声明Plan类
  {
    //声明2个字符串类型的数组字段
    private string[] days = new string[7] { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
    private string[] content = new string[7] { "看书", "游泳", "打篮球", "踢足球", "和朋友一起玩游戏", "参加计算机培训班", "做暑假作业"};
    //用this声明属性,并接收1个整数类型的参数,只有get访问器,表明只读
    internal string this[int i]
    {
      get
      {
        return days[i];
      }
    }
    //用this声明属性,并接收1个字符串类型的参数,只有get访问器,表明只读
    internal string this[string s]
    {
      get
      {
        return content[getindex(s)];
      }
    }
    //声明getindex方法,接收1个字符串参数,可返回参数在days数组中的索引值
    private int getindex(string s)
    {
      int j = 0;                 //用于days属性值的索引计数
      foreach (string t in days)       //遍历days数组元素
      {
        if (s == t)             //判断所接收字符串参数是否等于days数组
        {
          return j;  //如果参数等于days数组某个元素值,则返回这个元素的索引值(整型)
        }
        j++;
      }
      return -1;
    }  
    //声明Length属性,用于访问days数组的元素个数
    internal int Length
    {
      get
      {
        return days.Length;
      }
    }
  }

除了在类中应用索引器,在接口中也可以声明索引器,并被其他类实现,在ch01目录下新建一个程序文件,并命名为IndexInterface.cs,编写代码如程序1.15所示。

程序1.15 接口索引器示例:IndexInterface.cs

  using System;
  class IndexInterface
  {
    static void Main()
    {
      Iplan p = new Plan();           //创建Iplan类型的p,引用Plan类的实例
      for (int i = 0; i < p.Length; i++)    //从0到days数组元素个数的循环
      {
        if (i % 3 == 0)              //判断计数器i是否为3的倍数或i是否为0
        {
          Console.Write("\n+" + p[i] + "\t");  //输出days数组的元素值,前面加换行
        }
        else
        {
          Console.Write("+" + p[i] + "\t");    //输出days数组的元素值
        }
      }
    }
  }
  interface Iplan            //声明Iplan接口
  {
    string this[int i]        //声明未实现的索引器,接收1个整型参数
    {
      get;
    }
    int Length            //声明未实现的Length属性
    {
      get;
    }
  }
  class Plan : Iplan          //声明Plan,并实现接口
  {
    //声明2个字符串类型的数组字段
    private string[] days = new string[7] { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
    //实现接口的索引器
    public string this[int i]
    {
      get
      {
        return days[i];
      }
    }
    //实现接口的属性
    public int Length
    {
      get
      {
        return days.Length;
      }
    }
  }

在命令行下编译Index.cs后,执行Index程序,其效果如图1.20所示。

在索引器示例中,声明了一个Plan类(代表计划),存储了一个学生在暑假中每个礼拜周一到周日的活动。类中定义了两个字符串类型的数组字段,days数组用于存储周几,content数组则相应地存储了每天安排的活动内容。类中定义了两个索引器,接收整型参数的索引器可返回days数组相应的元素值,而接收字符串参数的索引器则返回content数组相应的元素。整个程序工作步骤如下所示:

(1)创建Plan类的实例p,通过p实例可以直接使用索引器访问集合。

(2)建立一个for循环,以i变量为计数器,i初始值为0,终止值为p的Length属性减去1。在类中,p的Length属性可返回days数组的元素个数,本例中p的Length属性值为7,则for循环次数为7次。

(3)在循环体中,依次输出两个索引器的返回值。

说明:

本例的重点在于字符串参数在索引器中的使用,通过getindex方法,判断字符串参数是否等于days中的元素,如果相等则返回索引值(整型)。最后通过索引值查询content数组相应索引的元素,这样就将两个数组联系起来了。
在命令行下编译IndexInterface.cs后,执行IndexInterface程序,其效果如图1.21所示。

接口的索引器和类中的索引器差别不大,只是类似于接口方法的声明,接口中索引器不能提供实现,必须由实现接口的类实现这个索引器。具体在本例中,声明了Iplan接口,接口中声明了索引器和Lenth属性,并且索引器和属性都是只读的。Plan类实现了这个接口,其索引器返回days数组的元素值,Length属性返回days数组的元素个数。程序工作的步骤如下:

(1)创建Iplan类型的引用变量p,并引用Plan类的实例。

(2)建立1个for循环,以i变量为计数器,i初始值为0,终止值为p的Length属性减去1。本例中p的Length属性值为7,则for循环次数为7次。

(3)在循环体中,首先判断i是否为3的倍数或i是否为0,如果是则换行输出索引器的返回值,否则直接输出索引器的返回值。

【分析】

类似于属性,访问类或结构的集合或数组类型可用索引器实现,索引器用this关键字声明。其声明方法如下代码所示:

数据类型 this[参数列表]
{
 get
 {
  以参数为索引返回集合或数组数据;
 }
 set
 {
  分配值到参数索引的元素;
 }
}

可见,索引器的访问器和属性类似,都是使用get和set,不过索引器的访问器不能添加修饰符。通过get和set访问器的选用,可确定索引器可读写、只读和只写的功能。索引器的参数类型和参数个数是索引器的签名,在同一个类中,多个索引器必须有不同的签名。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-10-31 23:01:38

《.NET程序员面试秘笈》----面试题13 举例说明索引器的作用的相关文章

《Java程序员面试秘笈》—— 1.13 使用工厂类创建线程

1.13 使用工厂类创建线程 工厂模式是面向对象编程中最常使用的模式之一.它是一个创建者模式,使用一个类为其他的一个或者多个类创建对象.当我们要为这些类创建对象时,不需再使用new构造器,而使用工厂类. 使用工厂类,可以将对象的创建集中化,这样做有以下的好处: ◆ 更容易修改类,或者改变创建对象的方式: ◆ 更容易为有限资源限制创建对象的数目.例如,我们可以限制一个类型的对象不多于n个. ◆ 更容易为创建的对象生成统计数据. Java提供了ThreadFactory接口,这个接口实现了线程对象工

《.NET程序员面试秘笈》---- 面试题11 举例说明简单工厂模式的作用

面试题11 举例说明简单工厂模式的作用 .NET程序员面试秘笈 [考点]工厂模式的理解,工厂模式在实际应用中的编写. [出现频率] [解答] 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.为了绕过常规对象的创建方法(new运算符创建实例),工厂模式提供一种"封装机制"来减少使用程序和这种"多系列具体对象创建工作"的耦合性. 说明: 这里的程序指客户程序之类的使用者. 简单工厂模式

《.NET程序员面试秘笈》----面试题16 请简述 .NET的命名空间

面试题16 请简述 .NET的命名空间 .NET程序员面试秘笈 [考点].NET的命名空间的基本理解,自定义命名空间的知识,在程序中使用命名空间的各种技巧. [出现频率] [解答] 使用命名空间的方法可以反映程序中的逻辑关系,并且可以有效避免类名冲突.命名空间就是各种类或其他类型名称的逻辑组织方式,而不代表物理组织方式.例如以下代码: System.Windows.Forms.MessageBox.Show("文本内容"); 在执行以上代码时,将跳出一个带有"确定"

《Java程序员面试秘笈》—— 面试题11 使用jar命令

面试题11 使用jar命令 Java程序员面试秘笈 请使用jar命令,将test文件夹压缩成.jar文件,并简述其压缩包的结构. 考点:对于Java程序员来说,更多情况下是使用的集成Java开发工具,例如JBuilder.Eclipse等,而对于最基本的Java编译和常见的命令行工具往往都不熟悉.这个面试题主要考察求职者对于Java命令行基本工具的使用,从而了解求职者对Java编程的熟悉程度. 出现频率: [面试题解析]熟练的Java开发者应该掌握常用的Java命令行工具.求职者应该熟练掌握ja

《Java程序员面试秘笈》—— 面试题12 如何执行mian()方法

面试题12 如何执行mian()方法 Java程序员面试秘笈 利用Java SDK中哪一条命令能够执行test的main()方法? (a)java test (b)javac test (c)java test.java (d)java test.class (e)java test.main 考点:考察求职者对java命令的熟悉程度. 出现频率: [面试题解析]求职者容易出现的错误是选择了(d).实际上,java命令后面只需要class文件的名称就可以,不用加入.class全名.如果使用jav

《.NET程序员面试秘笈》----第1章 .NET概念题 面试题1 简述面向对象的程序设计思想

第1章 .NET概念题 .NET程序员面试秘笈 本章内容包含面向对象程序设计和.NET的基础概念题,由于这部分题目涉及的范围比较广,因此在很多公司的面试题中占了比较大的比重.很多.NET程序员在编写代码时非常熟练,但往往缺乏对基础知识的深刻理解,从而导致面试失败.这类知识是程序设计的基础,如果不加以重视,程序编写就没有创造性,只能学一步,做一步. 面向对象编程是当前流行的编程方式,被大多数高级语言支持..NET程序同样是基于面向对象的设计,只有深刻理解面向对象的编程理念,才可以开发出结构良好的.

《.NET程序员面试秘笈》----面试题12 访问关键字this和base有什么作用

面试题12 访问关键字this和base有什么作用 .NET程序员面试秘笈[考点]this的理解,base的理解. [出现频率] [解答] this关键字用于引用类的当前实例.base关键字用于派生类访问基类成员. 为了说明this和base在类中的具体应用,在ch01目录下新建一个程序文件,并命名为This.cs,编写代码如程序1.13所示. 程序1.13 this和base示例:This.cs using System; class This { static void Main() { C

《.NET程序员面试秘笈》----面试题9 举例描述接口的作用

面试题9 举例描述接口的作用 .NET程序员面试秘笈[考点]接口类型的理解,接口在程序中的意义. [出现频率] [解答] 接口在程序设计中的作用为充当类或结构的功能界面,接口的属性.方法等属于抽象描述必须通过类或结构的实现才能使用.接口是使用者只知道接口有些什么功能,却不知道功能如何实现.由谁实现,这给程序的设计留下了很大的灵活性.例如某个项目由多个功能模块组成,每个模块由一个程序员完成,程序员只需编写完模块功能的实现后,留下该模块的接口供其他人使用.其他人在程序中只需直接使用接口的功能,而不必

《Java程序员面试秘笈》—— 面试题10 类继承的建模表示方法

面试题10 类继承的建模表示方法 Java程序员面试秘笈根据图1.4的UML表示,选择一个正确的描述. (a)Box类是MyBox类的子类. (b)Box类是MyBox类的父类. (c)Box类和MyBox类是聚合关系. (d)Box类和MyBox类是一对多关系. 考点:该面试题貌似简单,在实际的面试中回答正确的却并不是很多,其实只是考察求职者对类的继承的建模表示方法的掌握程度. 出现频率: [面试题解析]Java中有两种机制来保证根据现有的类来构造新的类,那就是继承和聚合.例如,有一个盒子的类