zoukankan      html  css  js  c++  java
  • 【转】跟小静读CLR via C#(11)无参属性、索引器

    提起属性,我们都不陌生。它用起来就像访问public数据成员一样,但实际上是调用了内部定义的相应方法。通过使用属性保持了较好的数据封装,而且访问很方便,接下来我们共同复习以下CLR允许定义的两种属性:无参属性和有参属性(索引器)。


    一、 无参属性

    1. 定义属性

    无参属性就是我们最常见的属性方式,在赋值时可以加入一定的逻辑判断。属性的定义其实不复杂,先看个直观的例子:

    image

    说明:

    • 属性要定义名称和类型,且类型不能是void。
    • 属性是不能重载的。我们不能定义名称相同、类型不同的两个属性。
    • 属性一般需要定义getset方法来操作类内部的私有支持字段,如上面的_name, _age等。Set方法中包含隐藏参数叫做value,表示赋给属性的值。
    • 只读只写属性:可以通过省略set来定义只读属性(如Count属性),或者省略get来定义只写属性。
    • CLR支持静态、实例、抽象和虚属性。例子中的Name和Age就是我们最常用的实例属性,Count就是静态只读属性的例子。

    调用:使用属性时会产生相应的智能感知,就像使用公用字段一样:

    image

    运行结果:

    image

    2. 编译结果

    通过ILDasm.exe查看元数据,

    image

    我们发现多了以下几项:

    ① 如果属性包含get访问器,则会生成“get_属性名” 的方法,如get_Age;

    ② 如果属性包含set访问器,则会生成“set_属性名”的方法,如set_Name;

    ③ 元数据中的属性定义项,包含了一些标记和属性类型,并引用了get或set访问器方法,这样就使属性和访问器之间产生了关联。例如Count属性定义项内容:

        image

    3. 自动实现的属性——AIP

    AIP(Automatically Implemented Property)是实现属性的一种更简洁的方式。例如上面的Student类,可以简化为:

    image

    调用方式和运行结果与之前一致,这里就不赘述了。

    简洁固然好,但要注意以下几点:

    ① AIP的get和set方法中不能添加断点调试。

    ② AIP属性必须是同时可读可写的。如果只定义get或者只定义set,则必须两个都显式实现,不能使用AIP。

    ③ 想要序列化或者反序列化的类中,不要定义AIP。因为运行时序列化引擎将字段名持久化到了序列化流中,而且每次编译时这个名字还有可能改变。

    二、 有参属性——索引器

    索引器是访问器包含参数的属性, C#是以数组的风格来公开索引器的。

    1. 定义索引器。

    image

    ① 和无参属性类似,索引器也需要定义get,set访问器,并且在set访问器中可以使用value关键字。不同的是,索引器的get访问器需要接受参数。

    ② 要使用this关键字定义索引器。

    调用:索引器使得对象可按照与数组相似的方法进行索引。

    image

    image

    2. 编译结果

    查看ILDasm.exe。

    image

    编译之后与无参属性类似,只不过编译器为访问器采用了默认名称Item:

    ① 如果索引器包含get访问器,则会生成“ get_Item” 的方法;

    ② 如果索引器包含set访问器,则会生成“set_Item”的方法;

    ③ 元数据中的属性定义项。

    3. 注意事项

    ① 默认产生的Item名称是可以修改的。可以通过向索引器添加“IndexerName”的attribute来实现。例如:

    image

    image

    ② 索引器可被重载。在C#中,一个类可以定义多个索引器,只要索引器的参数集不同即可。

    ③ 索引器可以有多个形参,例如当访问二维数组时。

    image

    ④ 索引器只能用于实例,不能用于静态。


    转自丫头小静(Cathy)的博客,原文地址:http://www.cnblogs.com/janes/archive/2011/08/16/2141380.html

  • 相关阅读:
    231. Power of Two
    204. Count Primes
    205. Isomorphic Strings
    203. Remove Linked List Elements
    179. Largest Number
    922. Sort Array By Parity II
    350. Intersection of Two Arrays II
    242. Valid Anagram
    164. Maximum Gap
    147. Insertion Sort List
  • 原文地址:https://www.cnblogs.com/xiaoyusmile/p/2534581.html
Copyright © 2011-2022 走看看