索引器 顾名思义,是用来索引的,那么C#中索引器是用来索引什么的呢

首先我们知道,C#中的数组是本身就可以索引的,那么C#中的类和结构呢,类和结构的实例是无法索引的,如果我们想让C#中类或者结构的实例也可以像数组一样进行索引,这个就是需要索引器了。这也就是索引器的作用

索引器允许类或者结构的实例按照与数组相同的方式进行索引.  注意,是类或者结构的实例, 所以索引器不能用static来声明,索引器永远属于实例成员,因此不能声明为static

举个简单的类子

    /// <summary>
/// 简单的索引器例子
/// </summary>
public class SimpleIndexExample
{ private string[] name = new string[]; //索引器必须以this关键字来定义,索引器中的this其实就是类实例化之后的对象,这是正确的理解方式
public string this[int index]
{ get { return name[index]; } set { name[index] = value; } } } public class Program
{ static void Main(string[] args)
{
//索引器SimpleIndexExample的使用
SimpleIndexExample myIndex = new SimpleIndexExample(); //对索引器赋值
myIndex[] = "Luke";
myIndex[] = "Mike"; //输出索引器的值
Console.WriteLine(myIndex[]);
Console.WriteLine(myIndex[]); } }

这样看来,索引器是不是和数组特别像,其实不然,索引器和数组有很多的区别

区别1:  索引器的索引值(Index)类型不限定为整数; 我们知道,用来访问数组的索引值(Index)一定为整数,而索引器的索引值类型则可以为其他类型,不一定就是整数

区别2:     索引器允许重载, 一个类不限定为只能定义一个索引器,只要索引器的函数签名不同,就可以定义多个索引器,可以重载它的功能

区别3:  索引器不是一个变量,索引器没有直接定义数据存储的地方,而数组有,定义一个数组变量,它就是一个变量。而索引器不是,索引器具有Get和Set访问器.

索引器与属性也同样有区别,区别如下:

区别1  索引器以函数签名方式this来标识,而属性采用名称来标识,名称可以任意。

区别2  索引器可以重载,而属性不能重载

区别3   索引器必须是类或者结构的实例才有,所以不能用static来进行声明,它永远属于实例成员. 而属性可以使用static来进行声明.

    /// <summary>
/// 以字符串为下标的索引器例子
/// </summary>
public class StringIndexExample
{ private Hashtable name = new Hashtable(); //索引器以字符串为下标
public string this[string index]
{ get { return name[index].ToString(); } set { name.Add(index, value); } } } public class Program
{ static void Main(string[] args)
{
//索引器StringIndexExample的使用
StringIndexExample myIndex = new StringIndexExample(); //对索引器赋值
myIndex["A01"] = "Luke";
myIndex["B01"] = "Mike"; //输出索引器的值
Console.WriteLine(myIndex["A01"]);
Console.WriteLine(myIndex["B01"]); } }

下面举一个比较复杂的索引器的例子,上面的索引器无论参数是int类型还是string类型,索引器都只有一个参数。下面我们举一个例子,有两个参数的索引器,同时,对索引器进行重载

    /// <summary>
/// 定义一个成绩实体类
/// </summary> public class Scores
{
/// <summary>
/// 学生姓名
/// </summary>
public string StuName { get; set; } /// <summary>
/// 课程ID
/// </summary>
public int CourseId { get; set; } /// <summary>
/// 分数
/// </summary>
public int Score { get; set; } } /// <summary>
/// 查找成绩的类中,定义索引器
/// </summary>
public class FindScore
{
private List<Scores> listScores; public FindScore()
{
listScores = new List<Scores>();
} //含有两个参数的索引器,通过学生姓名和课程编号来查找和保存成绩
public int this[string stuName, int courseId]
{
get
{
Scores sResult = listScores.Find(s => s.StuName == stuName && s.CourseId == courseId);
if (sResult != null)
{
return sResult.Score;
}
else
{
return -;
} } set
{ listScores.Add(new Scores() { StuName = stuName, CourseId = courseId, Score = value }); } } public List<Scores> this[string stuName]
{
get
{
List<Scores> sListResult = listScores.FindAll(l => l.StuName == stuName);
return sListResult; }
} static void Main(string[] args)
{ //多参数索引器和索引器重载
FindScore fScore = new FindScore();
fScore["Luke", ] = ;
fScore["Luke", ] = ;
fScore["Luke", ] = ;
fScore["Mike", ] = ; //查找Mike课程编号为1的成绩
Console.WriteLine("The score of Mike in Course 1 is:" + fScore["Mike", ]); //查找Luke所有课程的成绩
List<Scores> LukeListScores = fScore["Luke"]; if (LukeListScores.Count > )
{
foreach (Scores lukeS in LukeListScores)
{
Console.WriteLine(string.Format("Luke 课程编号{0} 成绩为{1}", lukeS.CourseId, lukeS.Score));
}
}
else
{
Console.WriteLine("没有该学生的成绩");
} } }

本文参考 https://www.cnblogs.com/lxblog/p/3940261.html

C#中索引器Indexer的学习使用的更多相关文章

  1. C# 类中索引器的使用二

    索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义 ...

  2. C# 类中索引器的使用

    索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义 ...

  3. 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测

    如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...

  4. C#中索引器的实现过程,是否只能根据数字进行索引?

    描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,  使程序看起来更为直观,更容易编写,可以用任意类型.

  5. C#中索引器的作用和实现。

    官方描述:索引器允许类或结构的实例就像数组一样进行索引.索引器形态类似于,不同之处在于它们的取值函数采用参数. 这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象有些资源 ...

  6. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?

    不是.可以用任意类型. 索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了 ...

  7. C#.NET常见问题(FAQ)-索引器indexer有什么用

    索引器就是名值对,你声明一个名值对的类,就可以给数组的指定元素赋值,也可以很方面的访问到指定元素值对应的下标(个人认为完全可以自己写一个类似的list来实现,没有必要多此一举学一个额外的方法)   复 ...

  8. Asp.Net中索引器的用法

    索引器定义类似于属性,但其功能与属性并不相同.索引器提供一种特殊的方法编写get和set访问器.属性可以像访问字段一样访问对象的数据,索引器可以使用户像访问数组一样访问类成员. 一.索引器特性 1.g ...

  9. C# 索引器(C#学习笔记05)

    索引器 索引器能够使对象像数组一样被索引,使用数组的访问方式 object[x] 索引器的声明在某种程度上类似于属性的声明,例如,使用 get 和 set 方法来定义一个索引器. 不同的是,属性值的定 ...

随机推荐

  1. Ansible playbook练习

    示例1:创建用户的Playbook --- - name: create user hosts: openstack gather_facts: false tasks: - name: create ...

  2. Hadoop 2.x简介

    Hadoop 2.0产生背景 Hadoop1.0中HDFS和MapReduce在高可用.扩展性等方面存在问题 HDFS存在的问题 NameNode单点故障,难以应用于在线场景 NameNode压力过大 ...

  3. J2EE 领域的一些技术框架结构图

    J2EE 领域的一些技术框架结构图       阿里百川,开启移动应用开发的新篇章 1.Spring 架构图 Spring 是一个开源 框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之 ...

  4. sqlserver 实现数据库全文检索

    --在执行该脚本程序之前启动sql server的全文搜索服务,即microsoft search服务 use huarui_db --打开数据库 go --检查huarui_db是否支持全文索引,如 ...

  5. 八 Django框架,模板语言

    模板语言就是可以将动态数据在html模板渲染的语言 一.接收值渲染 locals()函数,写在请求响应render()函数里,可以将逻辑处理函数里的变量传到html用模板语言渲染 {{...}}接收一 ...

  6. codeforces 655B B. Mischievous Mess Makers(贪心)

    题目链接: B. Mischievous Mess Makers time limit per test 1 second memory limit per test 256 megabytes in ...

  7. Android之ExpandableList扩展用法(基于BaseExpandableListAdapter)

    1.简介 基于基于BaseExpandableListAdapter扩展的ExpandableList用法,现在网上流行的主要有两种:第一种是向BaseExpandableListAdapter传入两 ...

  8. C/C++ 安全编码 —— 不安全的函数

    1. 文件与IO操作 gets():从控制台输入到字符数组: char response[8]; gets(response); 如果控制台输入超过 8 个字符,程序便会发生不确定的行为.其主要问题在 ...

  9. ffmpeg捕捉摄像头发送rtmp

    打印 DirectShow 支持的设备列表(true 可用1替换): ffmpeg -list_devices true -f dshow -i dummy 本计算机打印出的信息如下:[dshow @ ...

  10. ACM学习历程—广东工业大学2016校赛决赛-网络赛C wintermelon的魔界寻路之旅(最短路 && 递推)

    题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=2 题目由于要找对称的路径,那么狠明显可以把右下角的每一块加到左上角对应的每 ...