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. uva 11174 Stand in a Line

    // uva 11174 Stand in a Line // // 题目大意: // // 村子有n个村民,有多少种方法,使村民排成一条线 // 使得没有人站在他父亲的前面. // // 解题思路: ...

  2. 查询Oracle锁表和解决方法

    Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容.(1)锁表查询的代码有以下的形式:select count( ...

  3. HTML5 简易转盘

    这里我们使用两个Canvas进行转盘的绘画 canvas1用于绘画背景,Canvas2用于指针的转动: 把Canvas2背景设为透明并使用相对布局定位: #myCanvas2{ position: a ...

  4. CSS中强大的EM

    (转)作者:dearjohn ,发布于2012-7-31 http://www.uml.org.cn/html/201207311.asp 使用CSS也好久了,但一直都是在使用“px”来设置Web元素 ...

  5. JavaWeb开发学习(一)-JavaWeb开发概述

    1.Web相关概念 Web程序也就是一般所说的网站,由服务器.客户端浏览器以及网络组成.Web程序的好处是使用简单,不需要安装.学习,有一台电脑.一根网线就可以使用.Web程序不是一般意义上的网站.网 ...

  6. 练习1-23:删去C语言程序中所有的注释语句(C程序设计语言 第2版)

    #include <stdio.h> main() { FILE * fp_i; FILE * fp_o; fp_i = fopen("input.txt", &quo ...

  7. svn patch用法

    最近遇到了一个patch的使用场景: 有一个同事对源码做了一些修改,但是又不想将源码提交到SVN服务器,而我又想得到他所做的修改. patch的使用方法: 创建patch 在要导出“修改”的目录中,单 ...

  8. 在Nifi 里 把 HDFS Json 为csv 格式

    import org.apache.commons.io.IOUtilsimport java.nio.charset.*import java.text.SimpleDateFormatimport ...

  9. Sensor(GYROSCOPE)

    package com.example.sensor01; import java.util.List; import android.hardware.Sensor; import android. ...

  10. Portal.MVC —— nopcommerce的简化版

    Portal.MVC 简介 项目是基于MVC4+EF,带有角色,权限,用户中心及账户相关(登录,注册,修改密码,找回密码等)等基本功能.参考的开源项目 nopcommerce,这是一个电商架构的MVC ...