索引器是什么?有什么作用?索引器允许类的实例以访问数组的形式来访问对象里面的属性。如我们经常可以看到类似于dr[“name”]=”test”,或者说以config[“connectString”]来获取连接字符串的值。这都是使用索引器的例子,那么我们如何在自己的类中来定义索引器呢?

        索引器的简单使用

       其实索引器的定义非常简单,只需要使用this关键字即可。This关键字表示的是当前实例化的对象,所以通过这点,就知道索引器不能是静态的,它只能是实例化后才能使用。看下面的例子:

   1: public class People:IAnimal

   2:     {

   3:         private string strName;

   4:  

   5:         public string StrName

   6:         {

   7:             get { return strName; }

   8:             set { strName = value; }

   9:         }

  10:  

  11:         private string strNo;

  12:  

  13:         public string StrNo

  14:         {

  15:             get { return strNo; }

  16:             set { strNo = value; }

  17:         }

  18:  

  19:  

  20:         public string this[int a]

  21:         {

  22:             get

  23:             {

  24:                 if (a == 0)

  25:                 {

  26:                     return this.strName;

  27:                 }

  28:                 else

  29:                 {

  30:                     return this.strNo;

  31:                 }

  32:             }

  33:  

  34:             set

  35:             {

  36:                 if (a == 0)

  37:                 {

  38:                     this.strName = value;

  39:                 }

  40:                 else

  41:                 {

  42:                     this.strNo = value;

  43:                 }

  44:             }

  45:         }

  46:  

  47: }

        这就定义了一个参数为int类型的索引器,然后你在代码里面就可以通过数组的形式来给这个对象里面的属性赋值,也可以通过这种形式来读取这个对象的属性。

   1: static void Main(string[] args)

   2:        {

   3:            People p = new People();

   4:            p.StrName = "zhangsan";

   5:            p.StrNo = "11111";

   6:            //p[0] = "zhangsan";

   7:            //p[1] = "11111";

   8:  

   9:            Console.WriteLine("索引器" + p[0] + ";直接读取属性值:" + p.StrName);

  10:            Console.WriteLine("索引器" + p[1] + ";直接读取属性值:" + p.StrNo);

  11:            Console.ReadLine();

  12:         }

也可以定义一个参数为String的索引器,那么在索引的时候,就可以输入一个字符串,然后通过数组的形式来访问某个对象的属性。如:

   1: public string this[string str]

   2:         {

   3:             get

   4:             {

   5:                 if (str == "name")

   6:                 {

   7:                     return this.strName;

   8:                 }

   9:                 if (str == "no")

  10:                 {

  11:                     return this.strNo;

  12:                 }

  13:  

  14:                 throw new Exception("未找到对应的属性");

  15:             }

  16:  

  17:             set

  18:             {

  19:                 if (str == "name")

  20:                 {

  21:                     this.strName = value;

  22:                     return;

  23:                 }

  24:                 if (str == "no")

  25:                 {

  26:                     this.strNo = value;

  27:                     return;

  28:                 }

  29:  

  30:                 throw new Exception("未找到对应的属性");

  31:  

  32:             }

  33:         }

 

在接口中定义索引器

索引器是可以在接口中进行定义的,定义的形式如下:

   1: interface IAnimal

   2:    {

   3:         void Say();

   4:        //注意此处需要写上get,set而且后面还不能有分号

   5:         string this[string str]{get;set;}

   6:    }

调用及实现的时候,就跟调用和实现普通的方法是差不多的。

 

索引器的应用(读取配置文件)

定义一个Xml文件如下,读取里面的配置信息:

   1: <?xml version="1.0" encoding="utf-8" ?>

   2:   <connectstring >

   3:     <name key="db1" value="Database=test1111,userId=zhangsan,password=123;">

   4:     </name>

   5:     <name key="db2" value="Database=test2222,userId=lisi,password=123;">

   6:     </name>

   7:   </connectstring>

封装一个类,在这个类里面读取相应的Xml文件信息,并且定义一个索引器,到时候通过Xml文件中key的值来得到相应的数据库连接字符串:

   1: public class ConfigClass

   2:     {

   3:         public ConfigClass()

   4:         {

   5:             ReadFile();

   6:         }

   7:         private XmlDocument xmlDoc;

   8:         private XmlNode xmlNode;

   9:  

  10:         public void ReadFile()

  11:         {

  12:             string path = @"..\..\MyConfigure.xml";

  13:             this.xmlDoc = new XmlDocument();

  14:             this.xmlDoc.Load(path);

  15:             xmlNode = this.xmlDoc.SelectSingleNode(@"connectstring");

  16:  

  17:         }

  18:         private string conStr;

  19:  

  20:         public string ConStr

  21:         {

  22:             get { return conStr; }

  23:             set { conStr = value; }

  24:         }

  25:  

  26:         public string this[string str]

  27:         {

  28:             get

  29:             {

  30:                 XmlNodeList nodelist = xmlNode.ChildNodes;

  31:                 foreach (XmlElement xE in nodelist)

  32:                 {

  33:                     if (xE.Name == "name" && xE.GetAttribute("key")==str)

  34:                     {

  35:                         return xE.GetAttribute("value");

  36:                     }

  37:                 }

  38:  

  39:                 return "";

  40:  

  41:             }

  42:            

  43:         }

此例子纯属演示,所以很多细节也没注意,只要知道这个意思即可.前台调用如下:

   1: ConfigClass cofig = new ConfigClass();

   2:  

   3: Console.WriteLine(cofig["db1"]);

   4: Console.WriteLine(cofig["db2"]);

   5: Console.ReadLine();

运行结果情况如下:

参考:

http://www.cnblogs.com/lengbingshy/archive/2010/02/23/1671912.html

http://www.cnblogs.com/aspnethot/articles/1386650.html

http://www.cnblogs.com/ArmyShen/archive/2012/08/27/2659405.html

.NET基础知识之七——索引器的更多相关文章

  1. C#基础知识梳理索引

    C#基础知识梳理索引 一 引子 之前曾写了一篇随笔<.NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标> 三个月过去了,目标使更多的编程初学者,轻松高效地掌握C#开发的基础,重 ...

  2. python基础知识17---装饰器2

    函数式编程复习: def map_test(func,array): array_new=[] for i in array: array_new.append(func(i)) return arr ...

  3. python基础知识14---迭代器、生成器、面向过程编程

    阅读目录 一 迭代器 二 生成器 三 面向过程编程 一 迭代器 1 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初 ...

  4. Spring MVC基础知识整理➣拦截器和自定义注解

    概述 Spring MVC中通过注解来对方法或者类进行动态的说明或者标注,类似于配置标识文件的属性信息.当标注的类或者方式被使用时候,通过提取注解信息来达到对类的动态处理.在 MVC中,我们常用的注解 ...

  5. JVM基础知识2 垃圾收集器与内存分配策略

    如何判断堆中的哪些对象可以被回收 主流的程序语言都是使用根搜索算法(GC Roots Tracing)判定对象是否存活 基本思路是:通过一系列名为“GC Roots”的对象作为起点,从这些节点开始向下 ...

  6. python基础知识10-描述器和装饰器

    课前的解答 1.vim怎么退出都知道吧,配置了pep8,所以说会出现退出的时候error,再退出一次就ok q:退出 w:保存 wq 保存退出 q!:强制退出 shift + zz:保存退出 x:保存 ...

  7. Shiro基础知识08----拦截器介绍(转)

    1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3.1规范>http://www.iteye.com/b ...

  8. JAVA基础知识之JVM-——类加载器

    类加载器负责将.class文件加载到内存,并为其创建java.lang.Class对象,这个对象就代表这个类. 在Java中,通过包名+类名来唯一标识一个类,而在JVM中,要用 类加载器实例+包名+类 ...

  9. pthon基础知识(索引、切片、序列相加、乘法、检查元素是否是序列成员、计算序列长度、最大最小值)

    序列   数据存储方式  数据结构 python 列表.元组.字典.集合.字符串 序列: 一块用于存放多个值的连续内存空间,并且按一定顺序排列,可以通过索引取值 索引(编号): 索引可以是负数 从左到 ...

随机推荐

  1. css relative

    一.relative和absolute相煎关系 relative限制absolute 1.限制left/top/right/bottom定位 如果父元素有relative,只能根据父元素进行定位 2. ...

  2. 【题解】POJ1845 Sumdiv(乘法逆元+约数和)

    POJ1845:http://poj.org/problem?id=1845 思路: AB可以表示成多个质数的幂相乘的形式:AB=(a1n1)*(a2n2)* ...*(amnm) 根据算数基本定理可 ...

  3. PL/SQL知识点

    1.ROW_NUMBER() OVER(PARTITION BY XXX ORDER BY XXX) SELECT STP.FLOW_INST_ID, BUU.USER_NAME, ORGG.NAME ...

  4. C#实现异步GET的方法

    using System; using System.Collections.Generic; using System.Configuration; using System.IO; using S ...

  5. 前端DOM知识点

    DOM即文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.DOM把网页和脚本 ...

  6. 关于Echarts的原生js获取DOM元素与动态加载DOM元素的冲突问题

    1.前言: 最近在做的看板项目,因为需要循环加载后台数据,并且用Echarts做数据呈现,所以jQuery和angular等库统统靠边站,Echarts用的是原生js获取DOM元素,至于诸多不兼容等深 ...

  7. 21.Shiro在springboot与vue前后端分离项目里的session管理

    1.前言 当决定前端与后端代码分开部署时,发现shiro自带的session不起作用了. 然后通过对请求head的分析,然后在网上查找一部分解决方案. 最终就是,登录成功之后,前端接收到后端传回来的s ...

  8. 工具类(为控件设置圆角) - iOS

    为了便于日常开发效率,因此创建了一些小的工具类便于使用.具体 code 如下:声明: /* 为控件添加边框样式_工具类 */ #import <UIKit/UIKit.h> typedef ...

  9. Spring boot中使用servlet filter

    Spring boot中使用servlet filter liuyuhang原创,未经允许请勿转载! 在web项目中经常需要一些场景,如参数过滤防止sql注入,防止页面攻击,空参数矫正等, 也可以做成 ...

  10. 剑指offer js算法练习(1-10)

    1.二维数组中的查找       在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...