索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便、直观的被引用。索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。定义了索引器的类可以让您像访问数组一样的使用 [ ] 运算符访问类的成员。(当然高级的应用还有很多,比如说可以把数组通过索引器映射出去等等)

本文只是简单演示一下索引器的概念和基本的使用方法:

请看代码,下面是类的定义,中间包含了一个索引器定义

    class Program
{
static void Main(string[] args)
{
//声明并实例化这个类
Person p = new Person(); //使用索引器的方式来给类的两个属性赋值
p[] = "jarod";
p[] = "123456,./"; Console.WriteLine(p.Name);
Console.WriteLine(p.Password);
Console.ReadKey();
}
}
public class Person
{
//定义两个字段信息
private string name;
private string password; //定义一个 Name 属性来操作 name 字段
public string Name
{
set { name = value; }
get { return name; }
} //定义一个 Password 属性来操作 password 字段
public string Password
{
set { password = value; }
get { return password; }
} //定义索引器,name 字段的索引值为 0 ,password 字段的索引值为 1
public string this[int index]
{
get
{
if (index == ) return name;
else if (index == ) return password;
else return null;
}
set
{
if (index == ) name = value;
else if (index == ) password = value;
}
}
}

C#索引器(一)

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

简单的索引器实例:

    class Program
{
static void Main(string[] args)
{
IndexClass a = new IndexClass();
a[] = "张三";
a[] = "李四";
a[] = "王五";
Console.WriteLine("a[0]=" + a[]);
Console.WriteLine("a[1]=" + a[]);
Console.WriteLine("a[2]=" + a[]);
Console.ReadKey();
}
}
class IndexClass
{
private string[] name = new string[];
public string this[int index]
{
get { return name[index]; }
set { this.name[index] = value; }
}
}

索引器与数组的比较:

索引器的索引值不受类型限制。用来访问数组的索引值一定是整数,而索引器可以是其他类型的索引值。

索引器允许重载,一个类可以有多个索引器。

索引器不是一个变量没有直接对应的数据存储地方。索引器有get和set访问器。

C#索引器(二)

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

简单的索引器实例:

索引器与属性的比较:

标示方式:属性以名称来标识,索引器以函数签名来标识。

索引器可以被重载。属性则不可以被重载。

属性可以为静态的,索引器属于实例成员,不能被声明为static

多参数索引器实例:

    class Program
{
static void Main(string[] args)
{
ScoreIndex s = new ScoreIndex();
s["张三", ] = ;
s["张三", ] = ;
s["张三", ] = ;
s["李四", ] = ;
s["李四", ] = ;
s["李四", ] = ;
Console.WriteLine("张三课程编号为1的成绩为:" + s["张三", ]);
Console.WriteLine("张三的所有成绩为:");
ArrayList temp;
temp = s["张三"];
foreach (IndexClass b in temp)
{
Console.WriteLine("姓名:" + b.Name + "课程编号:" + b.CourseID + "分数:" + b.Score);
}
Console.ReadKey();
}
class IndexClass
{
private string _name;
private int _courseid;
private int _score;
public IndexClass(string _name, int _courseid, int _score)
{
this._name = _name;
this._courseid = _courseid;
this._score = _score;
}
public string Name
{
get { return _name; }
set { this._name = value; }
}
public int CourseID
{
get { return _courseid; }
set { this._courseid = value; }
}
public int Score
{
get { return _score; }
set { this._score = value; }
}
} class ScoreIndex
{
private ArrayList arr;
public ScoreIndex()
{
arr = new ArrayList();
}
public int this[string _name, int _courseid]
{
get
{
foreach (IndexClass a in arr)
{
if (a.Name == _name && a.CourseID == _courseid)
{
return a.Score;
}
}
return -;
}
set
{
arr.Add(new IndexClass(_name, _courseid, value)); //arr["张三",1]=90
}
}
//重载索引器
public ArrayList this[string _name]
{
get
{
ArrayList temp = new ArrayList();
foreach (IndexClass b in arr)
{
if (b.Name == _name)
{
temp.Add(b);
}
}
return temp;
}
}
}
}

备注:

所有索引器都使用this关键词来取代方法名。Class或Struct只允许定义一个索引器,而且总是命名为this。

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

get 访问器返回值。set 访问器分配值。

this 关键字用于定义索引器。

value 关键字用于定义由 set 索引器分配的值。

索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。

索引器可被重载。

索引器可以有多个形参,例如当访问二维数组时。

索引器可以使用百数值下标,而数组只能使用整数下标:如下列定义一个String下标的索引器 
public int this [string name] {...}

属性和索引器

属性和索引器之间有好些差别:

类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。

属性可以是static(静态的)而索引器则必须是实例成员。

C# 类中索引器的使用的更多相关文章

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

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

  2. 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测

    如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...

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

    描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,  使程序看起来更为直观,更容易编写,可以用任意类型.

  4. C#中索引器Indexer的学习使用

    索引器 顾名思义,是用来索引的,那么C#中索引器是用来索引什么的呢 首先我们知道,C#中的数组是本身就可以索引的,那么C#中的类和结构呢,类和结构的实例是无法索引的,如果我们想让C#中类或者结构的实例 ...

  5. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

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

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

  7. C#中索引器的作用和实现。

    官方描述:索引器允许类或结构的实例就像数组一样进行索引.索引器形态类似于,不同之处在于它们的取值函数采用参数. 这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象有些资源 ...

  8. Asp.Net中索引器的用法

    索引器定义类似于属性,但其功能与属性并不相同.索引器提供一种特殊的方法编写get和set访问器.属性可以像访问字段一样访问对象的数据,索引器可以使用户像访问数组一样访问类成员. 一.索引器特性 1.g ...

  9. Python类中装饰器classmethod,staticmethod,property,

    @classmethod 有的时候在类中会有一种情况,就是这个方法并不需要使用每一个对象属性 因此 这个方法中的self参数一个完全无用的参数,使用classmethod class A: __cou ...

随机推荐

  1. 使用jstl报错:According to TLD or attribute directive in tag file, attribute value does not accept any expressions

    使用jstl报错:According to TLD or attribute directive in tag file, attribute value does not accept any ex ...

  2. Xcode missing file or .png is missing from working copy

    当不小心在工程文件中删掉文件时.有可能会提示 .xxx   is missing from working copy 有可能是SVN引起的.删掉这个文件就好了 如果是单个文件.进入Terminal 相 ...

  3. linux2.6.30.4内核移植(2)——Nand Flash驱动移植

    内核源码:linux2.6.30.4 交叉编译工具:3.4.5 移植linux内核至:TQ2440 工作基础:http://www.cnblogs.com/nufangrensheng/p/36696 ...

  4. scala VS python2 (linux or shell)

    PS:只考虑最新版的scala和python2.x,由于python3.x和python2.x区别比较大,而且主流的一些开源项目都用的python2,目前python2一点点在兼容python3 1. ...

  5. Win10 PLSQL 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致

    plsql 登录后提示: Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different.Cha ...

  6. 新的Blog

    前两天闲着没事把blog弄了下,之前用jekyll折腾好久都不好使,最后还是决定用Hexo了= =.. .题解在两面都会更新 新Blog地址mlz000.github.io,欢迎来踩>_<

  7. logrotate日志不轮转呢?_新日志size0

    程序,要管理log,留作日后的后续功能处理和统计和领导需要.因为懒得写,所以直接用了syslog函数,把log交给rsyslog去写了.然后用logrotate每天做日志轮转. 两种log分别发送到了 ...

  8. CentOS 7 安装php5.6,Nginx,Memcached环境及配置

    安装php5.6版本以后不再需要安装Zend Guard,而是用yum命令安装php-opcache及php-pecl-apcu就可以有效的提高php执行速度. 1. 配置yum源 事先确认yum源的 ...

  9. CSS中常见的长度单位

    原文地址:https://segmentfault.com/a/1190000008934791?utm_source=tuicool&utm_medium=referral px - 像素 ...

  10. Ubuntu x86-64汇编(2)

    开发工具链 汇编编译器: yasm连接器: ld载入工具: os自带Debug工具:  ddd yasm安装 .tar.gz cd yasm-/ ./configure --prefix=/opt/y ...