跟小静读CLR via C#(11)-无参属性、索引器
2014-08-20 17:45
260 查看
提起属性,我们都不陌生。它用起来就像访问public数据成员一样,但实际上是调用了内部定义的相应方法。通过使用属性保持了较好的数据封装,而且访问很方便,接下来我们共同复习以下CLR允许定义的两种属性:无参属性和有参属性(索引器)。
1. 定义属性
无参属性就是我们最常见的属性方式,在赋值时可以加入一定的逻辑判断。属性的定义其实不复杂,先看个直观的例子:
说明:
属性要定义名称和类型,且类型不能是void。
属性是不能重载的。我们不能定义名称相同、类型不同的两个属性。
属性一般需要定义get和set方法来操作类内部的私有支持字段,如上面的_name, _age等。Set方法中包含隐藏参数叫做value,表示赋给属性的值。
只读只写属性:可以通过省略set来定义只读属性(如Count属性),或者省略get来定义只写属性。
CLR支持静态、实例、抽象和虚属性。例子中的Name和Age就是我们最常用的实例属性,Count就是静态只读属性的例子。
调用:使用属性时会产生相应的智能感知,就像使用公用字段一样:
运行结果:
2. 编译结果
通过ILDasm.exe查看元数据,
我们发现多了以下几项:
① 如果属性包含get访问器,则会生成“get_属性名” 的方法,如get_Age;
② 如果属性包含set访问器,则会生成“set_属性名”的方法,如set_Name;
③ 元数据中的属性定义项,包含了一些标记和属性类型,并引用了get或set访问器方法,这样就使属性和访问器之间产生了关联。例如Count属性定义项内容:
3. 自动实现的属性——AIP
AIP(Automatically Implemented Property)是实现属性的一种更简洁的方式。例如上面的Student类,可以简化为:
调用方式和运行结果与之前一致,这里就不赘述了。
简洁固然好,但要注意以下几点:
① AIP的get和set方法中不能添加断点调试。
② AIP属性必须是同时可读可写的。如果只定义get或者只定义set,则必须两个都显式实现,不能使用AIP。
③ 想要序列化或者反序列化的类中,不要定义AIP。因为运行时序列化引擎将字段名持久化到了序列化流中,而且每次编译时这个名字还有可能改变。
索引器是访问器包含参数的属性, C#是以数组的风格来公开索引器的。
1. 定义索引器。
① 和无参属性类似,索引器也需要定义get,set访问器,并且在set访问器中可以使用value关键字。不同的是,索引器的get访问器需要接受参数。
② 要使用this关键字定义索引器。
调用:索引器使得对象可按照与数组相似的方法进行索引。
2. 编译结果
查看ILDasm.exe。
编译之后与无参属性类似,只不过编译器为访问器采用了默认名称Item:
① 如果索引器包含get访问器,则会生成“ get_Item” 的方法;
② 如果索引器包含set访问器,则会生成“set_Item”的方法;
③ 元数据中的属性定义项。
3. 注意事项
① 默认产生的Item名称是可以修改的。可以通过向索引器添加“IndexerName”的attribute来实现。例如:
② 索引器可被重载。在C#中,一个类可以定义多个索引器,只要索引器的参数集不同即可。
③ 索引器可以有多个形参,例如当访问二维数组时。
④ 索引器只能用于实例,不能用于静态。
转自丫头小静(Cathy)的博客,原文地址:/article/4984399.html
一、 无参属性
1. 定义属性
无参属性就是我们最常见的属性方式,在赋值时可以加入一定的逻辑判断。属性的定义其实不复杂,先看个直观的例子:
说明:
属性要定义名称和类型,且类型不能是void。
属性是不能重载的。我们不能定义名称相同、类型不同的两个属性。
属性一般需要定义get和set方法来操作类内部的私有支持字段,如上面的_name, _age等。Set方法中包含隐藏参数叫做value,表示赋给属性的值。
只读只写属性:可以通过省略set来定义只读属性(如Count属性),或者省略get来定义只写属性。
CLR支持静态、实例、抽象和虚属性。例子中的Name和Age就是我们最常用的实例属性,Count就是静态只读属性的例子。
调用:使用属性时会产生相应的智能感知,就像使用公用字段一样:
运行结果:
2. 编译结果
通过ILDasm.exe查看元数据,
我们发现多了以下几项:
① 如果属性包含get访问器,则会生成“get_属性名” 的方法,如get_Age;
② 如果属性包含set访问器,则会生成“set_属性名”的方法,如set_Name;
③ 元数据中的属性定义项,包含了一些标记和属性类型,并引用了get或set访问器方法,这样就使属性和访问器之间产生了关联。例如Count属性定义项内容:
3. 自动实现的属性——AIP
AIP(Automatically Implemented Property)是实现属性的一种更简洁的方式。例如上面的Student类,可以简化为:
调用方式和运行结果与之前一致,这里就不赘述了。
简洁固然好,但要注意以下几点:
① AIP的get和set方法中不能添加断点调试。
② AIP属性必须是同时可读可写的。如果只定义get或者只定义set,则必须两个都显式实现,不能使用AIP。
③ 想要序列化或者反序列化的类中,不要定义AIP。因为运行时序列化引擎将字段名持久化到了序列化流中,而且每次编译时这个名字还有可能改变。
二、 有参属性——索引器
索引器是访问器包含参数的属性, C#是以数组的风格来公开索引器的。1. 定义索引器。
① 和无参属性类似,索引器也需要定义get,set访问器,并且在set访问器中可以使用value关键字。不同的是,索引器的get访问器需要接受参数。
② 要使用this关键字定义索引器。
调用:索引器使得对象可按照与数组相似的方法进行索引。
2. 编译结果
查看ILDasm.exe。
编译之后与无参属性类似,只不过编译器为访问器采用了默认名称Item:
① 如果索引器包含get访问器,则会生成“ get_Item” 的方法;
② 如果索引器包含set访问器,则会生成“set_Item”的方法;
③ 元数据中的属性定义项。
3. 注意事项
① 默认产生的Item名称是可以修改的。可以通过向索引器添加“IndexerName”的attribute来实现。例如:
② 索引器可被重载。在C#中,一个类可以定义多个索引器,只要索引器的参数集不同即可。
③ 索引器可以有多个形参,例如当访问二维数组时。
④ 索引器只能用于实例,不能用于静态。
转自丫头小静(Cathy)的博客,原文地址:/article/4984399.html
相关文章推荐
- 跟小静读CLR via C#(11)-无参属性、索引器
- 跟小静读CLR via C#(11)-无参属性、索引器
- 【转】跟小静读CLR via C#(11)-无参属性、索引器
- CLR via C#(11)-无参属性、有参数属性(索引器)
- 总结:CLR Via C#(第九章):属性与索引器
- 读<<CLR via C#>>总结(9) 索引器(有参属性)
- CLR Via C# 简单笔记之属性
- 读<<CLR via C#>>总结(8) 属性
- 跟小静读CLR via C#(08)-操作符
- [CLR via C#]10. 属性
- 跟小静读CLR via C#(15)--String,熟悉而又陌生
- 跟小静读CLR via C#(01)-.NET平台下代码是怎么跑起来的
- 跟小静读CLR via C#(02)-基元类型、引用类型、值类型
- 读<<CLR via C#>>总结(11) 详谈事件
- [CLR via C#]11. 事件
- 跟小静读CLR via C#(18)——Enum
- 跟小静读CLR via C#(06)- 构造器
- CLR via C# 3 读书笔记(11):第2章 生成、打包、部署和管理应用程序与类型 — 2.3 元数据简介
- 跟小静读CLR via C#(05)- 访问限定、数据成员
- 跟小静读CLR via C#(10)-参数