索引器是什么?有什么作用?索引器允许类的实例以访问数组的形式来访问对象里面的属性。如我们经常可以看到类似于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. 【[CTSC2018]混合果汁】

    题目 \(CTSC\)也有这么水的题啊 首先看到美味值来自于最小的美味值,我们就可以先考虑把所有的果汁按照美味值排序 接下来可以考虑二分,二分出一个\(mid\)我们只使用美味值大于等于\(mid\) ...

  2. HashMap面试知识点

    HashMap的工作原理是近年来常见的Java面试题. 几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如 ...

  3. 【洛谷P2577】[ZJOI2005]午餐

    午餐 题目链接 DP题都辣么毒瘤的么.. 首先,看一下题解 我们就有了思路: 贪心:显然,让吃饭慢的先打饭,sort一遍(证明?不存在的.. DP:f[i][j][k]表示前i个人,窗口1的打饭时间为 ...

  4. LeetCode11.盛最多水的容器 JavaScript

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...

  5. JavaScript创建对象的三种方法

    在 JavaScript 中我们知道无法通过类来创建对象,那么如何创建对象呢? (1)通过“字面量”方式创建对象 将你的信息写到{ }中,并赋值给一个变量,此时这个变量就是一个对象,例: var ga ...

  6. 字段中有空的时候 进行逻辑运算,mysql 与 oracle 处理函数IFNULL() 与 nvl() ,选取NULL 值 。

    mySQL数据库: SELECT id_p,IFNULL(math,0)+IFNULL(english,0) 总分 from mytest_brian1 Oracle 数据库: select  id_ ...

  7. Web中的中文参数乱码

    中文参数乱码    1 get方式传参,中文乱码        修改tomcat中的配置server.xml        在修改端口的标签中添加属性URIEncoding="XXX&quo ...

  8. 技能get:用HTML5实现波浪效果

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. 【TOJ 4309】表达式求值(模拟栈)

    Description Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经 ...

  10. Co. - Apple - MacBook Pro 快捷键

    Mac 键盘快捷键:https://support.apple.com/zh-cn/HT201236 从windows转到mac的童鞋,可能删除键是心中的一个痛,以前习惯一按delete什么都消失,其 ...