zoukankan      html  css  js  c++  java
  • C#中的索引器和属性

    C#中的索引器和属性
    2010-04-17 02:05

    属性

      所谓属性方法其实就是特殊的类成员,它实现了对私有类域的受控访问。在C#语言中有两种属性方法,其一是get,通过它可以返回私有域的值,其二是set,通过它就可以设置私有域的值。比如说,以下面的代码为例,其间创建了一个FirstName属性,由它控制对私有类成员firstname的访问:

    class Person {
    private string firstname;
    public string FirstName {
    get {return firstname;}
    set {firstname = value;}
    }
    }

    属性声明可以如下编码:
    Person p = new Person();
    p.FirstName = "Lamont";
    Console.WriteLine (p.FirstName);

      如你你所看到的那样,属性声明倒更像是域声明,只不过它还声明了两个特殊的成员,按照微软的说法就是所谓的访问函数(accessor)。当某一表达式的右边调用属性或者属性用作其他子程序(或者函数)的参数时即会调用get访问函数。反之,当表达式左边调用属性并且通过隐式传递value参数设置私有域值的情况下就会调用set访问函数。你可以创建只读属性,方法是省略set访问函数,这样任何设置属性的尝试都会产生编译错误。

      采用索引器的益处

      说了半天咱们转到正题上来,那么为什么我要兜这个圈子呢?其实,这是因为类的索引器非常像属性,从代码上看也是这样。以下是具有索引器的类示例,通过索引器会返回一个字符串:

    class Sample {
    public string this [int index] {
    get {return "You passed " + index; }
    }
    }

      注意,这里的属性名是this,意思是回引类的当前实例,参数列表包含在方括号而非括号之内。还有,这是一个只读索引器。为了把它改成读/写类型,我又添加了一个set访问函数。在定义索引器的时候,你不一定只采用一个参数。索引器参数可以采用任何类型,不过int是通常采用也是最为合理的类型。同一类中还可能拥有一个以上的索引器(重载)。

      如上定义了Sample类之后,我们就可以把索引器用作某种默认的属性,如下所示:

    Sample s = new Sample();
    Console.WriteLine(s[55]);

      属性和索引器

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

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

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

      为索引器定义的访问函数可以访问传递给索引器的参数,而属性访问函数则没有参数。

      接口

           在接口中也可以声明索引器,接口索引器与类索引器的区别有两个:一是接口索引器不使用修饰符;二是接口索引器只包含访问器get或set,没有实现语句。访问器的用途是指示索引器是可读写、只读还是只写的,如果是可读写的,访问器get或set均不能省略;如果只读的,省略set访问器;如果是只写的,省略get访问器。

    例如:

    public interface IAddress

    {

    string this[int index]{get;set;}

    string Address{get;set;}

    string Answer();

    }

    表示所声明的接口IAddress包含3个成员:一个索引器、一个属性和一个方法,其中,索引器是可读写的。

  • 相关阅读:
    JavaScript继承详解 转
    Chinese Consumer and Websites
    【转载】C#防SQL注入过滤危险字符信息
    记一次在数据库中查询:“包含”或者“仅包含”某些商品的订单的方法
    IE 6 position: relative + li 问题
    【转】c# 位操作
    基于asp.net MVC的无刷新文件上传
    C++ 类继承内存布局
    美杜杉 主动防御最新版
    [转]COM 连接点
  • 原文地址:https://www.cnblogs.com/baiyu/p/2151752.html
Copyright © 2011-2022 走看看