CLR支持静态、实例、抽象和虚属性。属性可以使用任意可访问性修饰符修饰。
属性不能重载。也就是说不能定义名称相同,类型不同的属性。
定义属性时,取决属性的定义,编译器在最后的托管程序集中生成以下两项或三项:
*)代表属性的get访问器方法的一个方法。仅在属性定义了get访问器方法时生成。
*)
代表属性的set访问器方法的一个方法。仅在属性定义了set访问器方法时生成。
*)托管程序集元数据中的一个属性定义。这一项是肯定要生成的。
属性和字段的比较:
1)
属性可以是只读或只写的,字段访问确总是可读和可写。如果定义一个属性,最好同时为它提供get和set访问器方法。
2)
一个属性方法可能抛出异常;字段访问永远不会抛出异常。
3)
属性不能作为out或ref参数传给方法;字段却可以。
4)属性方法可能花费较长时间执行;字段的访问总是立即完成的。
5)如果连续多次调用,属性方法每次都可能返回一个不同的值;而字段每次调用都返回相同的值。
6)属性方法可能造成明显的side effect(指访问属性时,除了单纯的设置或获取属性,还会造成对象状态的改变);字段访问永远不会。
7)属性方法可能需要额外的内存,或者返回一个不正确的引用,指向不属于对象状态一部分的某个东西,这样一来,对返回对象的修改就作用不到原始对象身上了。相反,查询字段返回的总是正确的引用,它指向的东西保证是原始对象状态的一部分。