一、索引器(Indexer)允许类和结构的实例像数组一样通过索引取值,可以看做是对[]运算符的重载,索引器实际上就是有参数的属性,也被称为有参属性或索引化属性,其声明形式与属性相似,不同之处在于索引器的访问器需要传入参数;
  1.声明索引器:

  1. class MyClass
  2. {
  3. string[] myArray = new string[];
  4. public string this[int index] //使用关键字this定义索引器
  5. {
  6. get
  7. {
  8. return myArray[index];
  9. }
  10. set
  11. {
  12. myArray[index] = value;
  13. }
  14. }
  15. }
  16. //使用索引器:
  17. MyClass myClass = new MyClass();
  18. myClass[] = "";
  19. Console.WriteLine(myClass[]); //

  ※属性和索引器都不被当作变量,二者都是在基于方法实现的,因此无法将属性或索引器作为引用参数、引用返回值、引用局部变量来传递和使用;

  ※索引器只能声明为实例成员,不能声明为静态的;

  ※索引器不支持自动实现;

  ※索引器只是在调用的写法上与数组相同,但实现原理与数组完全不同,二者不可混淆;

  2.声明泛型版本的索引器:

  1. class MyClass<T>
  2. {
  3. private T[] myArray = new T[];
  4. public T this[int index]
  5. {
  6. get
  7. {
  8. return myArray[index];
  9. }
  10. set
  11. {
  12. myArray[index] = value;
  13. }
  14. }
  15. }
  16. //使用索引器:
  17. MyClass<string> myClass = new MyClass<string>();
  18. myClass[] = "";
  19. Console.WriteLine(myClass[]); //

  3.索引器不仅可以根据整数进行索引,还可以根据任何类型进行索引,同时索引器也支持重载,类似于方法的重载,需要参数列表不完全相同,例如:

  1. public int this[string content]
  2. {
  3. get
  4. {
  5. return Array.IndexOf(myArray, content);
  6. }
  7. }

  4.索引器同时也支持参数列表有多个参数,类似于使用多维数组,例如:

  1. string[,] myArray = new string[, ];
  2. public string this[int posX, int posY]
  3. {
  4. get
  5. {
  6. return myArray[posX, posY];
  7. }
  8. set
  9. {
  10. myArray[posX, posY] = value;
  11. }
  12. }
  13. //使用索引器:
  14. MyClass myClass = new MyClass();
  15. myClass[, ] = "";
  16. Console.WriteLine(myClass[, ]); //

  二、索引器实际上就是有参数的属性,其属性名固定为Item,通过反射获取MyClass的属性信息数组即可看到:

  1. Type myType = typeof(MyClass);
  2. PropertyInfo[] myProperties = myType.GetProperties();
  3. for (int i = ; i < myProperties.Length; i++)
  4. {
  5. Console.WriteLine(myProperties[i].Name); //Item
  6. }

  1.通过反射调用索引器获取值:

  1. MyClass myClass = new MyClass();
  2. for (int i = ; i < ; i++)
  3. {
  4. myClass[i] = i.ToString();
  5. }
  6. PropertyInfo data = myType.GetProperty("Item");
  7. //如果索引器包含重载,例如上面this[string content]的例子,那么使用GetProperty的重载方法传入参数列表的类型数组来获取指定索引器myType.GetProperty("Item", new Type[] { typeof(int) })
  8. string myStr = (string)data.GetValue(myClass, new object[] { }); //第二个参数即索引器参数
  9. Console.WriteLine(myStr); //

  2.查看其IL代码:


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

C#面向对象--索引器的更多相关文章

  1. CSharp初级篇 1-4 this、索引器、静态、常量以及只读

    .NET Core CSharp初级篇 1-4 本节内容为this.索引器.静态.常量以及只读 简介 在之前的课程中,我们谈论过了静态函数和字段的一小部分知识,本节内容中,我们将详细的讲解关于对象操作 ...

  2. set,get方法(属性,索引器)

    很多时候我们不可以把一些字段暴露出来允许别人调用和修改,为了隐藏这些字段又便于加限制的使用,在面向对象编程中一般采用写get set函数的办法,比如: //字段_age, "_"表 ...

  3. 【.net 深呼吸】细说CodeDom(7):索引器

    在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...

  4. C# 索引器,实现IEnumerable接口的GetEnumerator()方法

    当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [ ...

  5. C#基础回顾(三)—索引器、委托、反射

    一.前言                                                                                       ------人生路 ...

  6. C#索引器

    索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...

  7. C#之索引器

    实际中不使用这个东西,只做了解 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  8. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

  9. 《精通C#》索引器与重载操作符(11.1-11.2)

    1.索引器方法结构大致为<modifier><return type> this [argument list],它可以在接口中定义: 在为接口声明索引器的时候,记住声明只是表 ...

随机推荐

  1. Samtec大数据技术解决方案

    序言:众所周知,大数据将在AI时代扮演重要角色,拥有海量数据的公司已在多个领域尝试对掌握的数据进行利用,大数据意识和能力进步飞快,体系和工具日趋成熟. Samtec和Molex 是获得许可从而提供 M ...

  2. sql05

    1.Ado.net Ado.net是一组由微软提供的使用C#操作数据库的类库 2.连接 首先引入: using System.Data.SqlClient; 需要使用连接字符串进行连接 using S ...

  3. 关于localStorage面试的那点事

    最近面试的时候关于html5API总会被问到localStorage的问题, 对于一般的问题很简单,无非就是 localStorage.sessionStorage和cookie这三个客户端缓存的区别 ...

  4. 快速排序python实现总结

    背景:数据结构与算法是IT相关的工程师一直以来的基础考察重点,很多经典书籍都是用c++或者java来实现,出于对python编码效率的喜爱,于是取search了一下python的快排实现,发现大家写的 ...

  5. frida入门总结

    一.Frida概述     Frida是一款轻量级HOOK框架,可用于多平台上,例如android.windows.ios等.     frida分为两部分,服务端运行在目标机上,通过注入进程的方式来 ...

  6. MapReduce 简单数据统计

    1. 准备数据源 摘录了一片散文,保存格式为utf-8 2. 准备环境 2.1 搭建伪分布式环境 https://www.cnblogs.com/cjq10029/p/12336446.html 上传 ...

  7. OpenGL 实践之贝塞尔曲线绘制

    说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图. 以下两个是比较经典的动图了. 二阶贝塞尔曲线: 三阶贝塞尔曲线: 由于在工作中经常要和贝塞尔曲线打交道,所以简 ...

  8. bootstrap table分页跳转到第一页

    1.destroy后重新初使化表格,可以将表格初始化封装为一个函数,destory后重新调用该函数进行初始化: 2.使用url刷新表格,$('#table').bootstrapTable('refr ...

  9. mycli初体验

    一.安装 pip install mycli 二.使用 mycli --help 三.特点 语法不全,高亮等

  10. 学习Docker的记录

    一.下载Docker for Windows  与  安装教程 参考文档一步一步的来学习  文档1  文档2 二.Docker的常用命令介绍 docker run  -it  --rm   -p 80 ...