选择显示字体大小

c#锐利体验(八)

  索引

  索引器(indexer)是c#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用。索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。下面是典型的索引器的设计,我们在这里忽略了具体的实现。

class myclass
{
  public object this [int index]
  {
    get
    {
      // 取数据
    }
    set
    {
      // 存数据
    }
  }
}

  索引器没有像属性和方法那样的名字,关键字this清楚地表达了索引器引用对象的特征。和属性一样,value关键字在set后的语句块里有参数传递意义。实际上从编译后的il中间语言代码来看,上面这个索引器被实现为:

class myclass
{
  public object get_item(int index)
  {
    // 取数据
  }
  public void set_item(int index, object value)
    {
            //存数据
  }
}

  由于我们的索引器在背后被编译成get_item(int index)和set_item(int index, object value)两个方法,我们甚至不能再在声明实现索引器的类里面声明实现这两个方法,编译器会对这样的行为报错。这样隐含实现的方法同样可以被我们进行调用,继承等操作,和我们自己实现的方法别无二致。通晓c#语言底层的编译实现为我们下面理解c#索引器的行为提供了一个很好的基础。

  和方法一样,索引器有5种存取保护级别,和4种继承行为修饰,以及外部索引器。这些行为同方法没有任何差别,这里不再赘述。唯一不同的是索引器不能为静态(static),这在对象引用的语义下很容易理解。值得注意的是在覆盖(override)实现索引器时,应该用base[e]来存取父类的索引器。

  和属性的实现一样,索引器的数据类型同时为get语句块的返回类型和set语句块中value关键字的类型。

  索引器的参数列表也是值得注意的地方。“索引”的特征使得索引器必须具备至少一个参数,该参数位于this关键字之后的中括号内。索引器的参数也只能是传值类型,不可以有ref(引用)和out(输出)修饰。参数的数据类型可以是c#中的任何数据类型。c#根据不同的参数签名来进行索引器的多态辨析。中括号内的所有参数在get和set下都可以引用,而value关键字只能在set下作为传递参数。

  下面是一个索引器的具体的应用例子,它对我们理解索引器的设计和应用很有帮助。

using system;
class bitarray
{
    int[] bits;
    int length;
    public bitarray(int length)
    {
        if (length < 0)
            throw new argumentexception();
        bits = new int[((length - 1) >> 5) + 1];
        this.length = length;
    }
    public int length
    {
        get { return length; }
    }
    public bool this[int index]
    {
        get
        {
            if (index < 0 index >= length)
                throw new indexoutofrangeexception();
            else
return (bits[index >> 5] & 1 << index) != 0;
        }
        set
        {
            if (index < 0 index >= length)
                throw new indexoutofrangeexception();
            else if(value)
                bits[index >> 5] = 1 << index;
            else
                bits[index >> 5] &= ~(1 << index);
        }
    }
}
class test
{
    static void main()
    {
        bitarray bits=new bitarray(10);
        for(int i=0;i<10;i++)
            bits[i]=(i&#37;2)==0;

            console.write(bits[i]+" ");
}
}

  编译并运行程序可以得到下面的输出:

  true false true false true false true false true false

  上面的程序通过索引器的使用为用户提供了一个界面友好的bool数组,同时又大大降低了程序的存储空间代价。索引器通常用于对象容器中为其内的对象提供友好的存取界面--这也是为什么c#将方法包装成索引器的原因所在。实际上,我们可以看到索引器在.net framework类库中有大量的应用。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons