C#中索引器Indexer的学习使用
索引器 顾名思义,是用来索引的,那么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的学习使用的更多相关文章
- C# 类中索引器的使用二
索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义 ...
- C# 类中索引器的使用
索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义 ...
- 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测
如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...
- C#中索引器的实现过程,是否只能根据数字进行索引?
描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取, 使程序看起来更为直观,更容易编写,可以用任意类型.
- C#中索引器的作用和实现。
官方描述:索引器允许类或结构的实例就像数组一样进行索引.索引器形态类似于,不同之处在于它们的取值函数采用参数. 这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象有些资源 ...
- 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
不是.可以用任意类型. 索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了 ...
- C#.NET常见问题(FAQ)-索引器indexer有什么用
索引器就是名值对,你声明一个名值对的类,就可以给数组的指定元素赋值,也可以很方面的访问到指定元素值对应的下标(个人认为完全可以自己写一个类似的list来实现,没有必要多此一举学一个额外的方法) 复 ...
- Asp.Net中索引器的用法
索引器定义类似于属性,但其功能与属性并不相同.索引器提供一种特殊的方法编写get和set访问器.属性可以像访问字段一样访问对象的数据,索引器可以使用户像访问数组一样访问类成员. 一.索引器特性 1.g ...
- C# 索引器(C#学习笔记05)
索引器 索引器能够使对象像数组一样被索引,使用数组的访问方式 object[x] 索引器的声明在某种程度上类似于属性的声明,例如,使用 get 和 set 方法来定义一个索引器. 不同的是,属性值的定 ...
随机推荐
- React Native 列表的总结
React Native 列表的总结 FlatList和SectionList都是React Native中高性能的列表组件.这些新的列表组件在性能方面都有了极大的提升, 其中最主要的一个是无论列表有 ...
- Ci下面隐藏index.php的方法
1.需要apache打开rewrite_module,然后修改httpd.conf的AllowOverride none 为AllowOverride All(里面,不同的环境目录不同) 2.在CI的 ...
- delphi的获取某坐标的颜色值
1.通过API函数GetPixel(),获取某个点的颜色值; var PT : TPoint; C : TColor; DC : HDC; hwd : THandle; I : integer; be ...
- intel dpdk api interrupt module 中断模块介绍
声明:此文档只做学习交流使用,请勿用作其他商业用途 author:朝阳_tonyE-mail : linzhaolover@gmail.comCreate Date: 2013-7-12 11:46: ...
- Vue从接口请求数据
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- BLOB (binary large object)
BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器. 在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型. BLOB是一个大文件,典型的BL ...
- bzoj3224Treap
Splay版本的会补... 在学了2个小时Splay之后深感Treap的优越 特地又花了20分钟打了个Treap 至于这些平衡树的优缺点 可以用平衡方式来直观的感受到 现在平衡树们面对着这样的一个问题 ...
- 创建Azure Blob Snapshot的脚本
在前面的文章中介绍了如何创建Azure Blob Snapshot.那篇文章中创建的脚本思路是:遍历所有Storage Account,找到所有vhd文件,进行Snapshot的创建. 但这种方式不够 ...
- Spring 3.1新特性之四:p命名空间设置注入(待补充)
https://www.ibm.com/developerworks/cn/java/j-lo-jparelated/ http://www.ibm.com/developerworks/cn/jav ...
- 人物-IT-马化腾:马化腾
ylbtech-人物-IT-马化腾:马化腾 马化腾,1971年10月29日生于原广东省海南岛东方市八所港(今海南省东方市),祖籍广东省汕头市.腾讯公司主要创办人之一.现任腾讯公司董事会主席兼首席执行官 ...