【转】.NET学习笔记(15)使用索引器
使用索引器
- 使用索引器,以数组风格访问对象
- 声明get accessor控制索引器读取访问
- 声明set accessor控制索引器写入访问
- 在接口中声明索引器
- 在从接口继承的结构和类中实现索引器
引言
- 类(结构)成员可以有很多,当用不同类型的单个私有字段时,用属性解决封装与隐藏问题——很好。
- 但当类中的字段是一个数组时,会出现问题
- 在程序中写如下语句较另人费解
bits&(1<<5)!=0 判断bits这个整数的第5位是否是1
bits&=~(1<<5) 设置bits这个整数的第5位清为0
bits|=(1<<5)设置bits这个整数的第5位置为1
- 用户易于理解的方式为
bits[5]=false/true
- 需用到一种当类中含有数组(bits是整数也是位数组)时的访问方法——索引器
索引器的概念
- C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作。
- 索引还有一重要特征——即可用非整数(其他类型如string)作为索引值来索引元素
- 索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写。
- 索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数 。
如何定义索引器
- 定义索引器的方式与定义属性有些类似,其一般形式如下:
[访问修饰符] 数据类型 this[索引类型 index]
{
get{//获得属性的代码}
set{ //设置属性的代码}
}
- 数据类型是表示将要存取的数组或集合元素的类型
- 索引器类型表示该索引器使用哪一类型的索引来存取数组或集合元素,可以是整数,可以是字符串;this表示操作本对象的数组或集合成员,可以简单把它理解成索引器的名字,因此索引器不能具有用户定义的名称。
接口中的索引器
- 在接口中也可以声明索引器,接口索引器与类索引器的区别有两个:一是接口索引器不使用修饰符;二是接口索引器只包含访问器get或set,没有实现语句。
- 访问器的用途是指示索引器是可读写、只读还是只写的,如果是可读写的,访问器get或set均不能省略;如果只读的,省略set访问器;如果是只写的,省略get访问器。
public interface IAddress
{
string this[int index]{get;set;}
string Address{get;set;}
string Answer();
}
- 表示所声明的接口IAddress包含3个成员:一个索引器、一个属性和一个方法,其中,索引器是可读写的。
索引器与属性的比较
- 索引器与属性都是类的成员,语法上非常相似。索引器一般用在自定义的集合类中,通过使用索引器来操作集合对象就如同使用数组一样简单;而属性可用于任何自定义类,它增强了类的字段成员的灵活性。
使用索引器注意
- 索引器不是方法——没有一对包含参数的圆括号,但有一对指定了索引的方括号
- 所有索引器都使用this关键字来取代方法名,每个类只允许定义一个索引器,而且总是命名为this
- 和属性一样,索引器也包含getaccessor和setaccessor
- 索引器声明 中指定的index将用调用索引时打指定的索引值来填充。Get和set accessor可以读取这个实参。
索引器与数组的比较
- 索引器可以使用非整数值下标,而数组只能使用整数下标
- 索引器可以重载(这和方法相似),而数组不可以
- 索引器不可以作为ref或out参数使用,而数组元素可以
在一个类或结构中创建索引器
struct RawInt
{
...
public bool this [ int index ]
{
get { ... }
set { ... }
}
...
}
在接口中定义索引器
interface IRawInt
{
bool this [ int index ] { get; set; }
}
在类(结构)中实现索引器接口
struct RawInt : IRawInt
{
...
public bool this [ int index ]
{
get { ... }
set { ... }
}
...
}
在类(结构)中显示接口实现索引器
struct RawInt : IRawInt
{
...
bool IRawInt.this [ int index ]
{
get { ... }
set { ... }
}
...
}
转自csxuedn的博客,原文地址:http://www.cnblogs.com/xiaoit/archive/2012/02/24/2366698.html