什么是索引器
属性可被视为一种智能字段;类似地,索引器可被视为一种智能数组。属性封装了类中的一个值,而索引器封装了一组值。使用索引器时,语法和使用数组完全相同。
C#提供了以下操作符来访问和操纵int中的单独的二进制位。
1、NOT(~)操作符:这是一元操作符,执行的是按位求补操作。例如11001100应用~操作符,结果是00110011
2、左移位(<<)操作符:这是二元操作符,执行的是左移位操作。表达式204<<2将返回48(在二进制中,204对应于11001100,所有位向左移动2个位置,结果是00110000,也就是十进制的48)。最左边的位会被丢弃,最右边则用0来补足。于此对应的是右移位操作符>>。
3、OR(|)操作符:这是二元操作符,执行的是按位OR操作。
4、AND(&)操作符:这是二元操作符,执行的是按位AND操作。
5、XOR(^)操作符:这是二元操作符,执行的是按位XOR(异或)操作,只有在两个位置的值不同的前提下,返回值的对应位置才是1。
使用索引器
定义索引器要采用一种兼具属性和数组特征的表示法。索引器由this关键字引入,this之前指定索引器的返回值类型。this之后的方括号中,要指定作为索引器使用的值的类型。
struct IntBits
{
private int bits;
public IntBits(int initialBitValue)
{
bits = initialBitValue;
}
public bool this [int index] //定义索引器
{
get
{
return (bit & (1 << index)) != 0;
}
set
{
if(value)
bits |= (1 << index);
else
bits &= ~(1 << index);
}
}
}
注意以下几点:
1、索引器不是方法——没有一对包含参数的圆括号,但有一对指定了索引的方括号。索引指定要访问哪一个元素。
2、所有索引器都使用this关键字取代方法名。每个类或结构只允许定义一个索引器(虽然可以重载并有多个实现),而且总是命名为this。
3、和属性一样,索引器也包含get和set这两个访问器。
4、索引器声明中指定的index将用调用索引器时指定的索引值来填充。
int adapted = 126; //126的二进制形式是01111110
IntBits bits = new IntBits(adapted );
bool peek = bit[6];
bit[0] = true;
bit[3] = false;
接口中的索引器
可在接口中声明索引器。为此,需要指定get以及/或者set关键字。但是,get和set访问器的主体要替换成分号。实现该接口的任何类或结构都必须实现接口所声明的索引器的访问。例如
interface IRawInt
{
bool this [int index] {get;set;} //接口中声明索引器
}
struct RawInt : IRawInt
{
......
public bool this [int index]
{
get{....}
set{.....}
......
}
}