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

    Hash (Digest) MD5 | SHA1 | SHA224 | SHA256 | SHA384 | SHA512 | SHA3 Cyclic Redundancy Check (CRC) CR ...

  2. POJ 2704 Pascal's Travels 【DFS记忆化搜索】

    题目传送门:http://poj.org/problem?id=2704 Pascal's Travels Time Limit: 1000MS   Memory Limit: 65536K Tota ...

  3. Android学习笔记_6_保存文件到SDCard

    一.加入访问sdcard的权限 Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态 ...

  4. HDU 2199 Can you solve this equation?(二分解方程)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2199 Can you solve this equation? Time Limit: 2000/10 ...

  5. MvcApplication 中方法的那点事

    最近比较闲,不知道干点啥,想找兼职没有合适的,不找工资又不够花,o(︶︿︶)o 唉! 说多了都是泪,入正题吧. 首先,新建一个MVC4.0项目,建好之后打开Global.asax文件,在MVCAppl ...

  6. C# 通过socket实现UDP 通信

    UDP不属于面向连接的通信,在选择使用协议的时候,选择UDP必须要谨慎.在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重.但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小, ...

  7. Unity3d Gis 坐标转换

    最近在做unity3d与Gis结合的项目,最基本的就是坐标的转换问题,比如把经纬度为(166.23.9.27 , 39.55.15.74) 转换到unity里面成相应的位置点,废话不多说 上代码: u ...

  8. redis介绍及常见问题总结

    1.redis c语言编写的一个开源软件,使用字典结构存储数据,支持多种类型数据类型 数据类型:字符串,字典,列表,集合,有序集合 2.redis特点 速度快:c语言实现的,所有数据都存储在计算机内存 ...

  9. JVM垃圾回收补充知识点

    1. 分代 虚拟机中的共划分为三个代: 年轻代(Young Gen):eden和survivor-8:1:1 年老代(Old Gen):存储大对象,由survivor晋升 永久代(perm Gen): ...

  10. 分布式压测系列之Jmeter4.0第一季

    1)Jmeter4.0介绍 jmeter是个纯java编写的开源压测工具,apache旗下的开源软件,一开始是设计为web测试的软件,由于发展迅猛,现在可以压测许多协议比如:http.https.so ...