.NET基础知识之七——索引器
索引器是什么?有什么作用?索引器允许类的实例以访问数组的形式来访问对象里面的属性。如我们经常可以看到类似于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基础知识之七——索引器的更多相关文章
- C#基础知识梳理索引
C#基础知识梳理索引 一 引子 之前曾写了一篇随笔<.NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标> 三个月过去了,目标使更多的编程初学者,轻松高效地掌握C#开发的基础,重 ...
- python基础知识17---装饰器2
函数式编程复习: def map_test(func,array): array_new=[] for i in array: array_new.append(func(i)) return arr ...
- python基础知识14---迭代器、生成器、面向过程编程
阅读目录 一 迭代器 二 生成器 三 面向过程编程 一 迭代器 1 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初 ...
- Spring MVC基础知识整理➣拦截器和自定义注解
概述 Spring MVC中通过注解来对方法或者类进行动态的说明或者标注,类似于配置标识文件的属性信息.当标注的类或者方式被使用时候,通过提取注解信息来达到对类的动态处理.在 MVC中,我们常用的注解 ...
- JVM基础知识2 垃圾收集器与内存分配策略
如何判断堆中的哪些对象可以被回收 主流的程序语言都是使用根搜索算法(GC Roots Tracing)判定对象是否存活 基本思路是:通过一系列名为“GC Roots”的对象作为起点,从这些节点开始向下 ...
- python基础知识10-描述器和装饰器
课前的解答 1.vim怎么退出都知道吧,配置了pep8,所以说会出现退出的时候error,再退出一次就ok q:退出 w:保存 wq 保存退出 q!:强制退出 shift + zz:保存退出 x:保存 ...
- Shiro基础知识08----拦截器介绍(转)
1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3.1规范>http://www.iteye.com/b ...
- JAVA基础知识之JVM-——类加载器
类加载器负责将.class文件加载到内存,并为其创建java.lang.Class对象,这个对象就代表这个类. 在Java中,通过包名+类名来唯一标识一个类,而在JVM中,要用 类加载器实例+包名+类 ...
- pthon基础知识(索引、切片、序列相加、乘法、检查元素是否是序列成员、计算序列长度、最大最小值)
序列 数据存储方式 数据结构 python 列表.元组.字典.集合.字符串 序列: 一块用于存放多个值的连续内存空间,并且按一定顺序排列,可以通过索引取值 索引(编号): 索引可以是负数 从左到 ...
随机推荐
- 面条代码 vs. 馄沌代码
转载自:https://blog.csdn.net/godsme_yuan/article/details/6594013
- 关于Unix哲学
http://www.ruanyifeng.com/blog/2009/06/unix_philosophy.html 这几天,我在看Unix,发现很多人在谈"Unix哲学",也就 ...
- (第三场) A PACM Team 【dp,五维背包】
链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 一篇博客:分类模型的 Loss 为什么使用 cross entropy 而不是 classification error 或 squared error
https://zhuanlan.zhihu.com/p/26268559 分类问题的目标变量是离散的,而回归是连续的数值. 分类问题,都用 onehot + cross entropy traini ...
- qbxt Day3 其余题
例题1 noiopenjudge9277 给出在最底层的木头的个数,问有多少种堆放木头的方式,当然你的堆放方式不能让木头掉下来. 在堆放的时候木头必须互相挨着在一起. 设dp[i]表示多少个log(原 ...
- Android学习笔记_81_Android ProgressDialog ProgressBar 各种效果
1,弹出Dialog 屏幕不变暗. 创建一个样式就OK了:在styles.xml文件里添加样式: 1, <style name="dialog" parent="@ ...
- Android 滑动效果汇总
Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...
- rank() over,dense_rank() over,row_number() over的区别
rank() over,dense_rank() over,row_number() over的区别 1.rank() over:查出指定条件后的进行排名.特点是,加入是对学生排名,使用这个函数,成绩 ...
- 开发的服务集群部署方案,以etcd为基础(java)
当前有很多服务集群部署,但是对于我们自己开发的服务系统怎么样能够解决部署问题,对大家很麻烦和笨重. 首先,我想说对于我们国内,小公司小系统比较多.大型系统毕竟少数,向阿里云看齐的不多.其实所谓的需要集 ...
- webpack中使用vue
1.安装vue cnpm i install -S 2.由于在 webpack 中,推荐使用 .vue 的文件模板文件定义组件 , 所以 ,需要安装 能解析这种文件的 loader cnpm i vu ...