戴志锋 管建和
摘 要 本文分析了C#中属性定义value隐式参数的传值机制,在此基础上进一步分析了.NET平台下托管程序代码的编译和执行过程。文中从C#语言、中间语言和汇编语言三方面详细地解释了value的传值机制,立足于类内部属性的基础上揭示了.NET平台下面向对象编程数据封装的要求及编译运行过程。
关键词 属性,中间语言,隐式参数,value
C#语言在面向对象设计和编程中对数据安全性提出了严格的要求,其中一条重要的原则便是数据封装(data encapsulation)。根据这一原则,在C#程序设计中要求开发人员对特定类的数据字段尽量不以公有方式提供给外界。这样在外界访问字段的同时能进行额外操作,诸如缓存数值、内存取值、计算取值和延缓类内部对象创建等,而保证访问字段线程的安全性。因此在类内部多数字段的访问权限被限定为private或protected,而这些字段与外界的交流经常采用属性来进行。
一、 属性
C#中的属性与VB类模块中的属性是相对应的,二者的使用方式也相同。从某种意义上讲,C#属性可以看成从VB的属性概念发展而来的。但C#属性(attribute)可以分为两种:一种为无参数属性,即通常所说的属性(property);另一种为带参数属性,C#中称为索引器(indexer)。本文着重研究前者的结构以及隐式参数value值传递的情况,后面所提到的属性均指property属性;对于indexer属性,可以从MSDN帮助文档和各类C#书籍获取相关资料。
属性的定义通常由以下两部分组成:
1. 需要封装的专用数据成员的定义。
private int _nValue = 1;
private double _dValue = 10.101;
private char _chValue = 'a';
2. 向外界提供访问的公共属性的定义。
下面是完整的读写属性nVlaue、只读属性dValue和只写属性chValue的声明,它们分别向外界提供用来访问类内部的私有成员变量_nValue(整型)、_dValue(双精度型)、_chValue(字符型)的接口。
|