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],它可以在接口中定义: 在为接口声明索引器的时候,记住声明只是表 ...
随机推荐
- python设置检查点简单实现
说检查点,其实就是对过去历史的记录,可以认为是log.不过这里进行了简化.举例来说,我现在又一段文本.文本里放有一堆堆的链接地址.我现在的任务是下载那些地址中的内容.另外因为网络的问题或者网站的问题, ...
- 关于排序原生js实现
内外排序的区别 排序可以分为两种:内排序和外排序.当数据量不算太大的时候,计算可以在内存中完成的排序称为内排序.当数据量特别大,计算的数据,需要分多次进入内存中进行计算的排序称之为外排序 插入排序 直 ...
- 【底层原理:深入理解计算机系统】#1 一切从"hello world"说起 (一)
计算机系统是由硬件和系统软件组成的,他们共同工作来运行应用程序.虽然系统的具体实现方式随着时间不断的在变化,但是系统的内在概念却没有改变的. 所有的计算机硬件和软件有着相似的结构和功能.这个系列专题便 ...
- OpenCV使用:加载图片时报错 0x00007FFC1084A839 处(位于 test1.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x00000026ABAFF1A8 处。
加载图片代码为: #include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...
- CSS——NO.3(CSS选择器)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- scrapy爬虫-代理IP中间件
class ProxyDownloaderMiddleware(object): # Not all methods need to be defined. If a method is not de ...
- Matplotlib数据可视化(3):文本与轴
在一幅图表中,文本.坐标轴和图像的是信息传递的核心,对着三者的设置是作图这最为关心的内容,在上一篇博客中虽然列举了一些设置方法,但没有进行深入介绍,本文以围绕如何对文本和坐标轴进行设置展开(对图像 ...
- LeetCode--二叉树2--运用递归解决树的问题
LeetCode--二叉树2--运用递归解决树的问题 在前面的章节中,我们已经介绍了如何利用递归求解树的遍历. 递归是解决树的相关问题最有效和最常用的方法之一. 我们知道,树可以以递归的方式定义为一个 ...
- 一次js自定义播放器,canvas绘制弹幕的尝试
不多bb,就直接说实现了什么功能: 1. 视频播放进度调整 2. 视频小窗口实时预览 3. 声音调整 4. 画中画模式 5. 网页全屏 6. 视频全屏 7. canvas绘制弹幕 8. 选中弹幕悬停 ...
- TCP/IP协议概要--01
学习一下tcp/ip协议,还是很枯燥,哎..... 图片的是从下到上对TCP/IP的协议进行描述的.主要是的描述每一层协议的特点 该层对应的是最底层的数据链路层,即图中的以太网驱动程序那一层. 该层是 ...