索引器是一个我们经常打交道的特性,在编程过程中,多多少少都会用到索引器。而关于索引器一些高级话题,如给自定义的类添加索引器等也是本文着重介绍的。索引器本质上是一组get和set访问器, []中提供的是get访问器查找元素所要的参数,以及查找set访问器所要设置的元素时使用的参数。一个类或结构中只能有一个索引器且名称只能为this(但是索引器可以重载,重载方法就是提供不同类型的索引参数,这也是特别值得注意的是一点,索引器可以有多个索引参数,即下面语法结构的[]中可以提供多个参数(当然这样使用索引器时也要提供相应数量的参数))。

索引器的语法结构

 1 public type this[type index]
 2 {
 3     get
 4     {
 5         GetAccessor
 6     }
 7     set
 8     {
 9         SetAccessor
10     }
11 }

第一个type是索引器(返回值)的类型,正如定义属性中的类型。而第二个type是索引的类型。类似于属性,定义的索引器也不会被分配命名空间,且get,set可以只实现一个或者都实现,但属性通常用于访问单个数据成员,索引用于访问多个数据成员。

在索引器中应该对索引器进行范围检查防止出现异常。另外不可以声明static的索引器。示例:下列自定义类型提供了一个索引器以使我们用更方便的方法来操作整型中的位。

 1 struct IntBits
 2 {
 3 public IntBits(int initialBitValue)  4  {  5 bits = initialBitValue;  6  }  7  8 private int bits;  9 10 public bool this[int index] 11  { 12 get 13  { 14 return (bits & (1 << index)) != 0; 15  } 16 set 17  { 18 //如果value为true,就开启比特,否则把它关闭 19 if (value) 20 bits |= (1 << index); 21 else 22 bits &= -(1 << index); 23  } 24  } 25 }

这个类的使用方式:

1 int adapted = 63;
2 IntBits bits = new IntBits(adapted);
3 //获取索引位置6的bool值
4 bool peek = bits[6];
5 //将索引0的比特设为true
6 bits[0] = true;
7 //将索引31的比特设为false
8 bits[31] = false;

索引器的下标可以是字符串等非整数。索引器不可以作为ref或者out参数。

下面再提供另一个索引器定义的示例:

 1 class Employee
 2 {
 3     public string LastName;
 4     public string FirstName;
 5     public string CityOfBirth;
 6
 7     public string this[int index]
 8     {
 9         set
10         {
11             switch (index)
12             {
13                 case 0:
14                     LastName = value;
15                     break;
16                 case 1:
17                     FirstName = value;
18                     break;
19                 case 2:
20                     CityOfBirth = value;
21                     break;
22                 default:
23                     throw new ArgumentOutOfRangeException("index");
24             }
25         }
26         get
27         {
28             switch (index)
29             {
30                 case 0:
31                     return LastName;
32                 case 1:
33                     return FirstName;
34                 case 2:
35                     return CityOfBirth;
36                 default:
37                     throw new ArgumentOutOfRangeException("index");
38             }
39         }
40     }
41 }

下面的代码展示了索引器重载的代码结构:

 1 class MyClass
 2 {
 3     public string this[int index]
 4     {
 5         set { … }
 6         get { … }
 7     }
 8
 9     public string this[int index1, int index2]
10     {
11         set { … }
12         get { … }
13     }
14
15     public string this[float index]
16     {
17         set { … }
18         get { … }
19     }
20 }

索引器中访问器的访问修饰符与属性访问器的遵守一致的规则:

Ø  当属性或索引既有get访问器也有set访问器时才能给访问器添加访问修饰符。

Ø  只能给两个访问器中的一个添加访问修饰符。

Ø  访问器的修饰符需要比成员的访问级别有更严格的限制。

另外,像是HashTable等字典类内部使用了索引器,从而可以使下列代码1用代码2这种更易懂的方式来表示:

方式1:

1 Hashtable ages = new Hashtable();
2 ages.Add("John", 23);

方式2:

1 ages["Green"] = 36;

接口中的索引器

类似于接口中定义的属性的方式,在索引器中也定义索引器的get与set访问器也不写实现而是直接给出一个分号。

1 interface IRawInt
2 {
3     bool this[int index] { get; set; }
4 }

接口的实现分隐式与显式,隐式实现时,可以标记public等,也可以标记virtual已被其子类重写。如果是显式实现则不能标记public,virtual等。

索引器中还结合泛型的使用,如Dictionary<T,U>中索引器的实现形如:

1 public virtual U this[T key]{ get; set; }

转载于:https://www.cnblogs.com/lsxqw2004/archive/2011/05/31/2063912.html

.Net学习难点讨论系列16 - 索引器相关推荐

  1. .NET Core on K8S 学习与实践系列文章索引 (更新至20191126)

    更新记录: -- 2019-11-26 增加Docker容器日志系列文章 近期在学习Kubernetes,基于之前做笔记的习惯,已经写了一部分文章,因此给自己立一个flag:完成这个<.NET ...

  2. .NET Core on K8S 学习与实践系列文章索引 (更新至20191116)

    更新记录: -- 2019-11-16 增加Docker容器监控系列文章 // 此外,今天是11月17日,我又老了一岁,祝我自己生日快乐! 近期在学习Kubernetes,基于之前做笔记的习惯,已经写 ...

  3. C#学习笔记--this关键字和索引器

     一.this关键字 在C#中,this关键字有以下3种常见的用法: 1.用在类的属性.实例方法或实例构造方法中,区分成员名和本地变量(或参数).下面的示例声明一个名为Myclass的类,类中包括 ...

  4. .NET Core 微服务学习与实践系列文章目录索引(2019版)

    Photo :.NET Core 文 | Edison Zhou 2018年,我开始学习和实践.NET Core,并开始了微服务的学习,以及通过各种开源组件搭建服务治理技术方案,并在学习过程中总结了一 ...

  5. Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法)

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  6. SQL Server 2008中SQL应用系列及BI学习笔记系列--目录索引 @邀月

    邀月 的数据库学习 http://www.cnblogs.com/downmoon/archive/2011/03/10/1980172.html SQL Server 2008中SQL应用系列及BI ...

  7. Caffe学习系列(16):各层权值参数可视化

    原文有更新: Caffe学习系列(16):各层权值参数可视化 - denny402 - 博客园 http://www.cnblogs.com/denny402/p/5103425.html 通过前面的 ...

  8. C# list集合 重复元素 索引_C#学习笔记12--集合/索引器/扩展

    在游戏开发的时候, 经常需要创建和管理相关对象组, 比如服务器列表, 商城物品列表等等. 在从服务器拿到这些数据的时候, 首先需要将他们存放到一个数据集合里面, 然后对集合中的数据循环遍历进行处理. ...

  9. 深度学习入门笔记系列(三)——感知器模型和 tensorboard 的使用方法

    本系列将分为 8 篇 .今天是第三篇 .主要讲讲感知器模型和 tensorboard 的基本使用方法 . 1. 感知器模型 因为小詹之前写过一篇感知器模型的介绍 ,这里就不赘述了 .有需要巩固的点击如 ...

最新文章

  1. 深层神经网络中的前向传播
  2. 小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈
  3. 【原创】贴片电容的测量方法。。。这是我从自己QQ空间转过来的,本人实操!...
  4. Android TextView 手动上下滑动
  5. xcode清除最近打开的文件列表
  6. mysql query cache 关闭_为什么要关闭MySQL query cache-Fun言
  7. ElasticSearch基于REST风格APi的常用操作
  8. 蚂蚁金服推出分布式的图神经知识表示框架,性能和可扩展性俱佳
  9. [改善Java代码]使用CyclicBarrier让多线程齐步走
  10. Spring的bean管理(注解创建对象)
  11. 皮尔逊相关系数公式手写代码【Python+详细注解】(Pearson correlation coefficient)
  12. ios设备管理 iMazing官方免费激活电脑版下载v2.11.6.0
  13. 在Deepin v20系统中安装RTL8821CE无线网卡驱动的步骤
  14. chrome控制台如何把vw显示成px_Python + selenium + Chrome 模拟登陆QQ邮箱,批量下载附件,本地重命名
  15. Spring——事物操作
  16. macw资讯:MacOS如何隐藏、加密文件或文件夹
  17. scum服务器设置网站,SCUM服务器配置详解 参数设置推荐
  18. 汽配行业最适合的ERP系统
  19. Docker 配置网络教程 - overlay 网络
  20. python命令解析使用多线程扫描端口

热门文章

  1. symfony小练习-表白墙
  2. JavaWeb编程(十)Json语句
  3. Python sys.path详解
  4. JQuery 扩展多语言支持
  5. 数据库大型应用解决方案总结(转)
  6. C#String.PadLeft函数,文本对齐以及填补解决方案
  7. Java(CallableStatement)调用Oracle存储过程返回结果集(ResultSet)
  8. 第七周项目二-友元类
  9. Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现​-[Android取经之路]
  10. dubbo 配置文件详解