索引器 顾名思义,是用来索引的,那么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. nginx配置大全

    nginx配置大全

  2. hd acm2025

    问题:平面上有n条折线,问这些折线最多能将平面分割成多少块? 思路:像这种平面被线段分割成几部分的问题,80%用递推解决,因为n条线段与(n-1)条线段能建立联系.   你可以作图观察一下,会发现新增 ...

  3. Linux初识(命令, 文件, 系统管理)

    Linux初识(命令, 文件) 文件系统 在Linux系统下,没有驱动器磁盘,只有一个根目录 / ,所有的文件都在根目录下面. 相关文件夹介绍 bin : 程序相关 boot : 开机启动相关 cdr ...

  4. JS高阶函数的理解(函数作为参数传递)

    JS高阶函数的理解 高阶函数是指至少满足下列条件之一的函数. · 函数可以作为参数被传递 · 函数可以作为返回值输出 一个例子,我们想在页面中创建100个div节点,这是一种写法.我们发现并不是所有用 ...

  5. POJ 1639 Picnic Planning:最小度限制生成树

    题目链接:http://poj.org/problem?id=1639 题意: 给你一个无向图,n个节点,m条边,每条边有边权. 让你求一棵最小生成树,同时保证1号节点的度数<=k. 题解: 最 ...

  6. 常见SQL函数需要注意的细节

    版权声明:本文为博主原创文章,未经博主允许不得转载. 这是一位牛人让我们思考的问题,说实话当时真蒙了,函数虽然明白,但细化到这种程度,真的是叫不准啊,下面是几道比较典型的问题,和本人做的实验,不一定准 ...

  7. Application.messagebox对话框样式

    if Application.MessageBox('删除不能恢复,确认删除吗?', '删除提示', MB_OKCANCEL + MB_ICONQUESTION)=mrOk thenbegin Sho ...

  8. 大数据日志分析产品——SaaS Cloud, e.g. Papertrail, Loggly, Sumo Logic;Open Source Frameworks, e.g. ELK stack, Graylog;Enterprise Products, e.g. TIBCO LogLogic, IBM QRadar, Splunk

    Learn how you can maximize big data in the cloud with Apache Hadoop. Download this eBook now. Brough ...

  9. JQuery表单验证插件EasyValidator

    本插件的宗旨是:用户无需写一行JS验证代码,只需在要验证的表单中加入相应的验证属性即可,让验证功能易维护,可扩展,更容易上手. DEMO中已经包含了常用的正则表达式,可以直接复用,为了考虑扩展性,所以 ...

  10. nodejs 解析 base64 文本

    使用Buffer对象,在创建Buffer,指定源的编码方式 Buffer.from(data, 'base64').toString(); 当然如果是解析图片或者二进制数据的话,就不需要toStrin ...