1、索引器(Indexer):

索引器允许类或者结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于他们的访问采用参数。

最简单的索引器的使用

    /// <summary>
/// 最简单的索引器
/// </summary>
public class IDXer
{
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)
{
//最简单索引器的使用
IDXer indexer = new IDXer();
//“=”号右边对索引器赋值,其实就是调用其set方法
indexer[] = "张三";
indexer[] = "李四";
//输出索引器的值,其实就是调用其get方法
Console.WriteLine(indexer[]);
Console.WriteLine(indexer[]);
Console.ReadKey();
}
}

2、索引器与数组的区别:

  • 索引器的索引值(Index)类型不限定为整数:

        用来访问数组的索引值(Index)一定为整数,而索引器的索引值类型可以定义为其他类型。

  • 索引器允许重载

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

  • 索引器不是一个变量

索引器没有直接定义数据存储的地方,而数组有。索引器具有Get和Set访问器。

3、索引器与属性的区别:

  • 索引器以函数签名方式 this 来标识,而属性采用名称来标识,名称可以任意
  • 索引器可以重载,而属性不能重载。
  • 索引器不能用static 来进行声明,而属性可以。索引器永远属于实例成员,因此不能声明为static。

以字符串作为下标,对索引器进行存取:

    //以字符串为下标的索引器
public class IDXer2
{
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)
{
//以字符串为下标的索引器
IDXer2 indexer2 = new IDXer2();
indexer2["A01"] = "张三";
indexer2["A02"] = "李四";
Console.WriteLine(indexer2["A01"]);
Console.WriteLine(indexer2["A02"]);
Console.ReadKey();
}
}

多参数索引器及索引器的重载

    /// <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 s = listScores.Find(x => x.StuName == stuName && x.CourseId == courseId);
if (s != null)
{
return s.Score;
}
else
{
return -;
}
}
set
{
listScores.Add(new Scores() { StuName = stuName, CourseId = courseId, Score = value });
}
} //索引器重载,根据名字查找所有成绩
public List<Scores> this[string stuName]
{
get
{
List<Scores> tempList = listScores.FindAll(x => x.StuName == stuName);
return tempList;
}
}
} static void Main(string[] args)
{
//多参数索引器和索引器重载
FindScore fScore = new FindScore();
fScore["张三", ] = ;
fScore["张三", ] = ;
fScore["张三", ] = ;
fScore["李四", ] = ;
//查找 张三 课程编号2 的成绩
Console.WriteLine("李四 课程编号2 成绩为:" + fScore["李四", ]);
//查找所有张三的成绩
List<Scores> listScores = fScore["张三"];
if (listScores.Count > )
{
foreach (Scores s in listScores)
{
Console.WriteLine(string.Format("张三 课程编号{0} 成绩为:{1}", s.CourseId, s.Score));
}
}
else
{
Console.WriteLine("无该学生成绩单");
}
Console.ReadKey();
}

--==源码下载==--

C# 索引器使用总结的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(7):索引器

    在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...

  2. C# 索引器,实现IEnumerable接口的GetEnumerator()方法

    当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [ ...

  3. C#基础回顾(三)—索引器、委托、反射

    一.前言                                                                                       ------人生路 ...

  4. C#索引器

    索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...

  5. C#之索引器

    实际中不使用这个东西,只做了解 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  6. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

  7. 《精通C#》索引器与重载操作符(11.1-11.2)

    1.索引器方法结构大致为<modifier><return type> this [argument list],它可以在接口中定义: 在为接口声明索引器的时候,记住声明只是表 ...

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

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

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

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

随机推荐

  1. 在c#中使用bitblt显示图片

    使用bitblt比DrawImage有更好的性能 using AForge.Video.DirectShow; using System; using System.Collections.Gener ...

  2. java构造器

    java的构造器不是方法,因为没有返回值. 构造器可以重载. 构造器的访问说明符: private:只有本类可以使用这个构造器. protected:这个类的子类和包中的类都可以使用此构造器. pub ...

  3. mono for android 各版本下载地址

    window下 在XamarinStudio 检查更新,会在这个目录下生成LOG和下载文件,所以可以从里面复制出来,查看真实下载地址 C:\Users\用户名\AppData\Local\Xamari ...

  4. ubuntu 14.04 下svn + apache2 配置

    1.svn的配置 sudo apt-get install subversion // 安装svn mkdir /home/svn // 创建仓库 svnadmin create /home/svn/ ...

  5. 微信公众号 扫码支付 模式二 demo

    扫码支付 本文附有代码,在下方,如果不熟悉场景的可以看看下面的场景介绍 场景介绍 官网介绍地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?ch ...

  6. 【String与基本类型之间的转换】以及【进制转换】

    1. 基本数据类型---->字符串类型: 方法一:使用连接一个空字符串,例如  基本数据类型+“” : 方法二:静态方法 String.valueOf(),具体有: String.valueOf ...

  7. vmware下的linux的host only上网配置

    1.虚拟机 的网络适配器类型,选择Host-only.启动时修改网络适配器类型需要关电源重启. 2.本机电脑设置,网络邻居 启用 VMware Virtual Ethernet Adapter for ...

  8. 酷狗 KRC 文件的解析

    清理硬盘发现以前写过一个进行一半的代码,这次补全并从硬盘删掉. 格式说明来自 https://shansing.com/read/392/ krc解码并解压缩后得到一个字符串,例子: [id:$000 ...

  9. 分享我开发的网络电话Android手机APP正式版,图文详解及下载

    分享我开发的网络电话Android手机APP正式版,图文详解及下载 分享我开发的网络电话Android手机APP正式版 实时语音通讯,可广域网实时通讯,音质清晰流畅! 安装之后的运行效果: 第一次安装 ...

  10. Web端导出CSV

    前端导出文件大部分还是通过服务器端的方式生成文件,然后传递到客户端.但很多情况下当我们导出CSV时并不需要后端参与,甚至没有后端. 做过WebGIS的同学经常会碰到这种场景,用户的兴趣点数据以csv文 ...