索引器是什么?有什么作用?索引器允许类的实例以访问数组的形式来访问对象里面的属性。如我们经常可以看到类似于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. SQL SERVER 2012断日志

    有一个SQL2012库的日志达到了100G左右,平时开发人员根本没有做过事务日志备份,而磁盘空间已经快满了.所以,只能截断它.但是,由于从2K8以后,SQL SERVER好像不再提供 truncate ...

  2. 调用URL 接口服务

    1.Net调用URL 接口服务 using System; using System.Collections; using System.Configuration; using System.Dat ...

  3. 【luogu P3379 最近公共祖先】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3379 倍增求lca,先存下板子,留个坑以后再填讲解. in 5 5 43 12 45 11 42 43 23 ...

  4. markdown的常用高级操作。

    符号 说明 对应编码(使用时去掉空格) 英文怎么说 & AND 符号 & amp; ampersand < 小于 & lt; little 大于 & gt; gr ...

  5. 【题解】POJ 2115 C Looooops (Exgcd)

    POJ 2115:http://poj.org/problem?id=2115 思路 设循环T次 则要满足A≡(B+CT)(mod 2k) 可得 A=B+CT+m*2k 移项得C*T+2k*m=B-A ...

  6. FreeImage.lib库的配置和简单使用 转

    转载地址 http://www.codeweblog.com/win8-1%E4%B8%8Bfreeimage-lib%E5%BA%93%E7%9A%84%E9%85%8D%E7%BD%AE%E5%9 ...

  7. 【办公】Microsoft Office 2016 专业增强版下载及永久激活-亲测分享

    Win7 x64,安装 Office 2016. 1. 下载 Office 2016,用迅雷网上下载飞快.(这里分享我的下载链接,2.39G用迅雷分分钟就下好了) 2. 按 此博客 ,安装激活工具. ...

  8. SpringMVC知识点总结

    1. SpringMVC概述        SpringMVC是一个WEB层框架,主要用来负责与页面的交互.        SpringMVC是Spring家族的一大组件.Spring整合Spring ...

  9. 使用补丁破解IntelliJ IDEA 2017收费版本(转)

    1. 首先去官网http://www.jetbrains.com/idea/download/#section=windows下载Ultimate版(注意不是community版)下载并安装.一定要记 ...

  10. PThread 学习笔记

    POSIX 线程,也被称为Pthreads,是一个线程的POSIX标准: pthread.h int pthread_create(pthread_t * thread, pthread_attr_t ...