索引器是什么?有什么作用?索引器允许类的实例以访问数组的形式来访问对象里面的属性。如我们经常可以看到类似于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. 动态规划(DP),Human Gene Functions

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1027 http://poj.org/problem?id=108 ...

  2. vue快速使用

    1.引用脚本 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script ...

  3. 商城管理系统项目(前台+后台+管理员+用户+html+jsp)

    管理员后台 用户前台 如果下载项目报错,加包即可(包已经打包放在下载地址) 数据库:mysql drop database shoppingmall; create database shopping ...

  4. HDU 1254 推箱子(BFS加优先队列)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others)    Me ...

  5. AngularJS 五 过滤器及验证

    AngularJS过滤: AngularJS过滤器允许我们格式化数据以在UI上显示而不改变原始格式. 格式: 一些比较重要的过滤器: Number               Filter       ...

  6. C#基础 一(方法详解)

    需要知道:类和方法的关系 方法和参数修饰符 自定义方法可以有或没有参数,也可以有或没有返回值.可以被各种关键字(static.virtual.public.new等)修饰以限制其行为. C#参数修饰符 ...

  7. 下载YouTube视频的网站和工具

    1.界面友好,可选择的清晰度较多(我个人用这个比较多) http://en.savefrom.net/ 2.几乎可以解析到所有的清晰度 http://www.clipconverter.cc 3.可选 ...

  8. 菜鸟崛起 DB Chapter 3 MySQL 5.6的基本操作

    3   MySQL的基本操作 上面我们学习一如何安装数据库,那么这节我们来认识一下数据库: 我们在MySQL安装后,在data目录下会自动生成几个必须的数据库,可以使用SHOW DATABASES语句 ...

  9. IO Jar包

    密码e7ed https://pan.baidu.com/share/init?surl=LakzlwrjolWwpoft5j6aBg

  10. 重置按钮_reset

    function formreset(form){ for(var i=0;i<frmMain.length;i++){ if(frmMain.item(i).type=="text& ...