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 方法来定义一个索引器. 不同的是,属性值的定 ...
随机推荐
- hd acm 1297
问题:n个人排队,要求女生不能单独站,可以全是男生,可以全是女生. 例子:n=7,FFFF,FFMM,FFFM,MFFF,MMFF,MMMM,MFFM(F代表女生,M代表男生). 代码:(来自 蓝飞技 ...
- Exception in thread "main" java.io.IOException: Mkdirs failed to create /var/folders/q0/1wg8sw1x0dg08cmm5m59sy8r0000gn/T/hadoop-unjar6090005653875084137/META-INF/license at org.apache.hadoop.util.Run
在使用hadoop运行jar时出现. 解决方法 zip -d Test.jar LICENSE zip -d Test.jar META-INF/LICENSE 完美解决.
- JSP<jsp:forward>与<%@ include%>
JSP<jsp:forward>与<%@ include%><jsp:include> <jsp:forward file="forwardTo_p ...
- LightOJ 1138 二分
1138 - Trailing Zeroes (III) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
- python3字符串属性(二)
1.S.isdecimal() -> bool Return True if there are only decimal characters in S, False otherwise ...
- 机器学习(十九)— xgboost初试kaggle
1.官网下载kaggle数据集Homesite Competition数据集,文件结构大致如下: 2.代码实战 #Parameter grid search with xgboost #featur ...
- Selenium-元素定位与操作
UI的自动化本质就是识别元素,操作元素,而元素的识别就是通过HTML的标签和属性,所以对于基本的HTML的只是是必备的 随着页面复杂度的提升,加之很多公司的开发也没有统一规范,这就给识别元素造成了非常 ...
- Linux_服务器_08_网卡eth1修改为eth0
一.现象 二.解决步骤 1.修改 70-persistent-net.rules 执行命令: vim /etc/udev/rules.d/-persistent-net.rules 找到与ifconf ...
- Java进阶06 容器
Java中有一些对象被称为容器(container).容器中可以包含多个对象,每个对象称为容器中的一个元素.容器是用对象封装的数据结构(data structure). 充满梦想的容器 不同的数据结构 ...
- I.MX6 Android 永不休眠
/************************************************************************* * I.MX6 Android 永不休眠 * 说明 ...