1. 概述

索引器允许类或结构的实例就像数组一样进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。索引器在语法上方便您创建客户端应用程序可将其作为数组访问的类、结构或接口。索引器经常是在主要用于封装内部集合或数组的类型中实现的。

例如,假定具有一个名为 TempRecord 的类,此类表示在 24 小时内的 10 个不同时间记录的华氏度。此类包含一个表示温度的 float 类型的名为“temps”的数组和表示记录温度的日期的 DateTime。通过在此类中实现一个索引器,客户端可以通过 float temp = tr[4] 而不是 float temp = tr.temps[4] 语法访问 TempRecord 实例中的温度。索引器表示法不仅简化了客户端应用程序的语法,还使其他开发人员能够更加直观地理解类及其用途。使用索引器可以用类似于数组的方式为对象建立索引。

get 访问器返回值。set 访问器分配值。this 关键字用于定义索引器。value 关键字用于定义由 set 索引器分配的值。

索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。索引器可被重载索引器可以有多个形参,例如当访问二维数组时。

2. 示例:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace NetTest

{

public class TestIndexClass

{

public void Test()

{

TempRecord tempRecord = new TempRecord();

// Use the indexer's set accessor

tempRecord[3] = 58.3F;

tempRecord[5] = 60.1F;

// Use the indexer's get accessor

for (int i = 0; i < 10; i++)

{

// This example validates the input on the client side. You may

// choose to validate it in the class that implements the indexer, and throw an

// exception or return an error code in the case of invalid input.

if (i < tempRecord.Length)

{

System.Console.WriteLine("Element #{0} = {1}", i, tempRecord[i]);

}

else

{

System.Console.WriteLine("Index value of {0} is out of range", i);

}

}

//Uncomment this code to see how the .NET Framework handles indexer exceptions

//try

//{

//    System.Console.WriteLine("Element #{0} = {1}", tempRecord[tempRecord.Length]);

//}

//catch (System.ArgumentOutOfRangeException e)

//{

//    System.Console.WriteLine(e);

//}

DayCollection week = new DayCollection();

System.Console.WriteLine(week["Fri"]);

System.Console.WriteLine(week["Made-up Day"]);

}

}

class TempRecord

{

// Array of temperature values

private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F,

61.3F, 65.9F, 62.1F, 59.2F, 57.5F };

// Auto-Implemented Property

System.DateTime date { get; set; }

// To enable client code to validate input

// when accessing your indexer.

public int Length

{

get { return temps.Length; }

}

// Indexer declaration.

// Input parameter is validated by client

// code before being passed to the indexer.

public float this[int index]

{

get

{

return temps[index];

}

set

{

temps[index] = value;

}

}

}

//C# 并不将索引类型限制为整数。例如,对索引器使用字符串可能是有用的。通过搜索集合内的字符串并返回相应的值,可以实现此类索引器。

//由于访问器可被重载,字符串和整数版本可以共存。

class DayCollection

{

string[] days = { "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" };

// This method finds the day or returns -1

private int GetDay(string testDay)

{

int i = 0;

foreach (string day in days)

{

if (day == testDay)

{

return i;

}

i++;

}

return -1;

}

// The get accessor returns an integer for a given string

public int this[string day]

{

get

{

return (GetDay(day));

}

}

}

}

C#拾遗系列(4):索引器相关推荐

  1. .Net学习难点讨论系列16 - 索引器

    索引器是一个我们经常打交道的特性,在编程过程中,多多少少都会用到索引器.而关于索引器一些高级话题,如给自定义的类添加索引器等也是本文着重介绍的.索引器本质上是一组get和set访问器, []中提供的是 ...

  2. 步步为营VS 2008 + .NET 3.5系列文章索引

    介绍 步步为营VS 2008 + .NET 3.5系列文章索引:VS 2008新特性.C# 3.0新特性.LINQ查询操作符.DLINQ(LINQ to SQL).XLINQ(LINQ to XML) ...

  3. sql server 索引阐述系列五 索引参数与碎片

    原文:sql server 索引阐述系列五 索引参数与碎片 -- 创建聚集索引 create table [dbo].[pub_stocktest] add constraint [pk_pub_st ...

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

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

  5. MySQL索引系列--联合索引--使用/原理/优化

    原文网址:MySQL索引系列--联合索引--使用/原理/优化_IT利刃出鞘的博客-CSDN博客 简介         本文介绍MySQL的联合索引(也可以称为:组合索引.复合索引)的用法. MySQL ...

  6. 积少成多 Flash(ActionScript 3.0 Flex 3.0) 系列文章索引

    [源码下载] 积少成多 Flash(ActionScript 3.0 & Flex 3.0) 系列文章索引 作者:webabcd Flash 之 ActionScript 3.0  1.积少成 ...

  7. 读CLR via C#总结(9) 索引器(有参属性)

    索引器,即访问器接受参数的属性.在C#中是以数组风格的语法来公开索引器的.所以这使得对象可按照与数组相似的方式进行索引. 一,定义索引器 internal class IndexerTest<T ...

  8. 《.Net框架程序设计》读书笔记 之 结构和索引器

    一:结构和索引器(又称含参属性) class classStruct {     struct MyStruct     {         public string[] strTest;      ...

  9. python indexerror_python – “IndexError:位置索引器超出范围”,当它们明显没有时

    这是我正在使用的一些代码的MWE.我通过切片和一些条件慢慢缩小初始数据帧,直到我只有我需要的行.每行五行实际上代表一个不同的对象,因此,当我减少一些事情时,如果每个五个块中的任何一行符合条件,我想保留 ...

最新文章

  1. 采集/自动登录啊都可以用这两个方法实现 asp.net
  2. Easy Scheduler 1.0.2 发布,分布式工作流任务调度系统
  3. 返回顶部小火箭(仿电脑管家)
  4. [C++11]智能指针简单介绍
  5. 查看照片的指定位置的像素点值,并在照片中绘制一条指定像素颜色的线段
  6. ZZULIOJ 1136: 首字母变大写
  7. 数组元素替换_Linux Shell 通俗简要的讲解数组操作
  8. 有的网线接口为什么做不到轻薄化?
  9. Flutter布局锦囊---完善信息页
  10. 如何让你的ASO优化效果提升10倍?
  11. MS UC 2013-0-Prepare Tool
  12. 请解决datagridview
  13. solr6.3与MySQL结合使用的简明教程一
  14. 无需重装软件,解决不满足升级要求问题,Windows10成功升级Windows11方案——以戴尔XPS15 9550 i7-6700HQ CPU为例
  15. al换脸一键生成_使用al生成详细的课程计划
  16. Python 实现Tracert追踪TTL值
  17. 关于我发的这个PDF文件的理解
  18. 【Matlab】imcrop的用法
  19. PR-Place-performing Placement and Optimization-1
  20. 用数据分析看泰坦尼克号

热门文章

  1. 【Python自学笔记】10个爬虫入门实例,附源码与注释
  2. 美国本科计算机专业,美国本科计算机专业的最新排名介绍
  3. js截屏代码_JavaScript网页截屏方法,你get到了嘛?
  4. 了解下Lua 环境安装
  5. 百利而无一害的技术——Linux
  6. 用Scrapy爬虫框架爬取食品论坛数据并存入数据库
  7. HDU6346(最小权值完美匹配)
  8. [SCOI2008]着色方案
  9. python转csv_python脚本如何将Excel文件转为csv文件(代码)
  10. 0x08.基本算法 — 总结与练习