C#面向对象--索引器
一、索引器(Indexer)允许类和结构的实例像数组一样通过索引取值,可以看做是对[]运算符的重载,索引器实际上就是有参数的属性,也被称为有参属性或索引化属性,其声明形式与属性相似,不同之处在于索引器的访问器需要传入参数;
1.声明索引器:
- class MyClass
- {
- string[] myArray = new string[];
- public string this[int index] //使用关键字this定义索引器
- {
- get
- {
- return myArray[index];
- }
- set
- {
- myArray[index] = value;
- }
- }
- }
- //使用索引器:
- MyClass myClass = new MyClass();
- myClass[] = "";
- Console.WriteLine(myClass[]); //
※属性和索引器都不被当作变量,二者都是在基于方法实现的,因此无法将属性或索引器作为引用参数、引用返回值、引用局部变量来传递和使用;
※索引器只能声明为实例成员,不能声明为静态的;
※索引器不支持自动实现;
※索引器只是在调用的写法上与数组相同,但实现原理与数组完全不同,二者不可混淆;
2.声明泛型版本的索引器:
- class MyClass<T>
- {
- private T[] myArray = new T[];
- public T this[int index]
- {
- get
- {
- return myArray[index];
- }
- set
- {
- myArray[index] = value;
- }
- }
- }
- //使用索引器:
- MyClass<string> myClass = new MyClass<string>();
- myClass[] = "";
- Console.WriteLine(myClass[]); //
3.索引器不仅可以根据整数进行索引,还可以根据任何类型进行索引,同时索引器也支持重载,类似于方法的重载,需要参数列表不完全相同,例如:
- public int this[string content]
- {
- get
- {
- return Array.IndexOf(myArray, content);
- }
- }
4.索引器同时也支持参数列表有多个参数,类似于使用多维数组,例如:
- string[,] myArray = new string[, ];
- public string this[int posX, int posY]
- {
- get
- {
- return myArray[posX, posY];
- }
- set
- {
- myArray[posX, posY] = value;
- }
- }
- //使用索引器:
- MyClass myClass = new MyClass();
- myClass[, ] = "";
- Console.WriteLine(myClass[, ]); //
二、索引器实际上就是有参数的属性,其属性名固定为Item,通过反射获取MyClass的属性信息数组即可看到:
- Type myType = typeof(MyClass);
- PropertyInfo[] myProperties = myType.GetProperties();
- for (int i = ; i < myProperties.Length; i++)
- {
- Console.WriteLine(myProperties[i].Name); //Item
- }
1.通过反射调用索引器获取值:
- MyClass myClass = new MyClass();
- for (int i = ; i < ; i++)
- {
- myClass[i] = i.ToString();
- }
- PropertyInfo data = myType.GetProperty("Item");
- //如果索引器包含重载,例如上面this[string content]的例子,那么使用GetProperty的重载方法传入参数列表的类型数组来获取指定索引器myType.GetProperty("Item", new Type[] { typeof(int) })
- string myStr = (string)data.GetValue(myClass, new object[] { }); //第二个参数即索引器参数
- Console.WriteLine(myStr); //
2.查看其IL代码:
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!
作者:Minotauros
出处:https://www.cnblogs.com/minotauros/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
C#面向对象--索引器的更多相关文章
- CSharp初级篇 1-4 this、索引器、静态、常量以及只读
.NET Core CSharp初级篇 1-4 本节内容为this.索引器.静态.常量以及只读 简介 在之前的课程中,我们谈论过了静态函数和字段的一小部分知识,本节内容中,我们将详细的讲解关于对象操作 ...
- set,get方法(属性,索引器)
很多时候我们不可以把一些字段暴露出来允许别人调用和修改,为了隐藏这些字段又便于加限制的使用,在面向对象编程中一般采用写get set函数的办法,比如: //字段_age, "_"表 ...
- 【.net 深呼吸】细说CodeDom(7):索引器
在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...
- C# 索引器,实现IEnumerable接口的GetEnumerator()方法
当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [ ...
- C#基础回顾(三)—索引器、委托、反射
一.前言 ------人生路 ...
- C#索引器
索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...
- C#之索引器
实际中不使用这个东西,只做了解 using System; using System.Collections.Generic; using System.Linq; using System.Text ...
- C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-
1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...
- 《精通C#》索引器与重载操作符(11.1-11.2)
1.索引器方法结构大致为<modifier><return type> this [argument list],它可以在接口中定义: 在为接口声明索引器的时候,记住声明只是表 ...
随机推荐
- Samtec大数据技术解决方案
序言:众所周知,大数据将在AI时代扮演重要角色,拥有海量数据的公司已在多个领域尝试对掌握的数据进行利用,大数据意识和能力进步飞快,体系和工具日趋成熟. Samtec和Molex 是获得许可从而提供 M ...
- sql05
1.Ado.net Ado.net是一组由微软提供的使用C#操作数据库的类库 2.连接 首先引入: using System.Data.SqlClient; 需要使用连接字符串进行连接 using S ...
- 关于localStorage面试的那点事
最近面试的时候关于html5API总会被问到localStorage的问题, 对于一般的问题很简单,无非就是 localStorage.sessionStorage和cookie这三个客户端缓存的区别 ...
- 快速排序python实现总结
背景:数据结构与算法是IT相关的工程师一直以来的基础考察重点,很多经典书籍都是用c++或者java来实现,出于对python编码效率的喜爱,于是取search了一下python的快排实现,发现大家写的 ...
- frida入门总结
一.Frida概述 Frida是一款轻量级HOOK框架,可用于多平台上,例如android.windows.ios等. frida分为两部分,服务端运行在目标机上,通过注入进程的方式来 ...
- MapReduce 简单数据统计
1. 准备数据源 摘录了一片散文,保存格式为utf-8 2. 准备环境 2.1 搭建伪分布式环境 https://www.cnblogs.com/cjq10029/p/12336446.html 上传 ...
- OpenGL 实践之贝塞尔曲线绘制
说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图. 以下两个是比较经典的动图了. 二阶贝塞尔曲线: 三阶贝塞尔曲线: 由于在工作中经常要和贝塞尔曲线打交道,所以简 ...
- bootstrap table分页跳转到第一页
1.destroy后重新初使化表格,可以将表格初始化封装为一个函数,destory后重新调用该函数进行初始化: 2.使用url刷新表格,$('#table').bootstrapTable('refr ...
- mycli初体验
一.安装 pip install mycli 二.使用 mycli --help 三.特点 语法不全,高亮等
- 学习Docker的记录
一.下载Docker for Windows 与 安装教程 参考文档一步一步的来学习 文档1 文档2 二.Docker的常用命令介绍 docker run -it --rm -p 80 ...