第十六章、使用索引器

  什么是索引器

  属性可被视为一种智能字段;类似地,索引器可被视为一种智能数组。属性封装了类中的一个值,而索引器封装了一组值。使用索引器时,语法和使用数组完全相同。

  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{.....}

  ......

  }

  }

原文地址:https://www.cnblogs.com/linhuide/p/5819888.html