BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / dot-net / #234同步于 2009/11/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
dotNET机器人发帖

【转帖】属性(Property)和特性(Attribute)

ahomer
2009/11/29镜像同步6 回复
http://blog.csai.cn/user1/16236/archives/2009/39771.html 很多文章都有介绍过这两种事物的联系和区别,从技术角度讲,这部分文章都分析得很透彻。现在让我们从分析的角度去看两者的联系和区别。 属性(Property)和特性(Attribute,或者称“特质”更合理)是.NET,甚至是一系列面向对象语言中的重要概念,但由于两者的英文单词都可以翻译为中文的“属性”,所以很容易被混淆。比如,在Windows操作系统中,文件的“只读”、“隐藏”、“系统”等属性,其本身的英文单词是"attribute",这可以从DOS命令行程序"attrib"看出。 首先应该了解到,Property和Attribute是面向对象的范畴,而不会是.NET特有的东西,虽然.NET已经实现了这两个概念。换句话说,面向对象语言都应该具有这两个概念,因为它们都是存在于现实世界的物质。 先说说Attribute。从.NET技术来看,特性是一种类,这些类继承于System.Attribute类,用于对类、属性、方法、事件等进行描述,它可以看成是一种元数据,主要用在反射中。那么从面向对象的角度看,其实Attribute是类型级别的,而不是对象级别的,它描述的是一种类型的不变的特质,而任何对象实例都无法改变这种特质。比如:人的皮肤有四种颜色,亚洲人和欧洲人,肤色不同。那么“肤色”就是描述于人之上的一种特质,对于任何一个亚洲人,无论他/她是谁,皮肤总是黄色的。我们可以看下面的示范代码,以便更清楚地认识这个概念: [AttributeUsage(AttributeTargets.Class)] public class SkinColorAttribute : System.Attribute { public Color Color { get; set; } } public class People { } [SkinColor(Color=Color.Yellow)] public class AsianPeople : People { } 从技术上看,属性表现为getter/setter方法,而从面向对象的角度看,属性要比特性更好理解,它是针对每一个对象而言的,它是对象的一种状态描述,它会因对象个体的不同而不同,针对同一对象,它也可以在不同的情景、时刻产生不同的变化。比如人的年龄、性别、说话的声音响度、身高、体重等。 特性可以转化为只读属性,这是通过反射机制实现的,这并不难理解,就拿上面的例子,每个人都有肤色,只不过肤色的状态是天生的,不会改变的。 有时候,换个角度考虑问题,会让自己获得更大的收获。
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
UnitTest机器人#1 · 2009/11/29
赞~
Nonsense机器人#2 · 2009/11/29
属性Property本质上是方法 特性Attribute其实就是个标签
univer机器人#3 · 2009/11/29
嗯,同意~ 其实如果不使用反射,特性(尤其是自定义特性)存在的意义并不大~ 但是特性在反射和反射相关的技术中能发挥非常大的作用~ 【 在 nonsense 的大作中提到: 】 : 属性Property本质上是方法 : 特性Attribute其实就是个标签
UnitTest机器人#4 · 2009/11/29
【 在 univer 的大作中提到: 】 : 嗯,同意~ : 其实如果不使用反射,特性(尤其是自定义特性)存在的意义并不大~ : 但是特性在反射和反射相关的技术中能发挥非常大的作用~ 呃,其实正主不是反射,反射和特性都是为了元数据而生的。反射用来访问元数据,特性用来构造元数据。 在以前的C++中,由于在编译的时候将类型信息抹去了,所以不需要反射这种手段,但它是可以有元数据的,它可以把元数据放在静态变量里面,比如MFC中的RTTI的实现就是用一个宏在类里面定义了一个静态变量,用来存放类型化信息。 过去的COM技术就是用一个独立的文件存放类型化信息,后来发现这种物理上的分离很容易造成混乱,操作起来也麻烦,干脆都放到同一个dll中得了,也便于管理,这就搞出个反射技术来 元数据的存放地方还可以很多,比如方法名称,外部文件(比如xml),全局变量,反正你能想到的地方都有可能做,放在不同的地方,访问手段和构造手段也不一样,当然如果你高兴的话,也可以把这些访问手段统称为“反射” 啰啰嗦嗦说了这么多,本质上就是“代码即数据”,简单地说,如果你要计算机做一件事情,无论你用那门语言,哪个特性,你都得告诉它同样多的数据。而如何组织这些数据,在什么地方存放,在哪个阶段生成,如何生成,这些就是程序设计语言研究的问题了,这也涉及到一个生产效率的问题。
ahomer机器人#5 · 2009/11/29
赞~ m起来保存 【 在 UnitTest (不知所措) 的大作中提到: 】 : 呃,其实正主不是反射,反射和特性都是为了元数据而生的。反射用来访问元数据,特性用来构造元数据。 : 在以前的C++中,由于在编译的时候将类型信息抹去了,所以不需要反射这种手段,但它是可以有元数据的,它可以把元数据放在静态变量里面,比如MFC中的RTTI的实现就是用一个宏在类里面定义了一个静态变量,用来存放类型化信息。 : 过去的COM技术就是用一个独立的文件存放类型化信息,后来发现这种物理上的分离很容易造成混乱,操作起来也麻烦,干脆都放到同一个dll中得了,也便于管理,这就搞出个反射技术来 : ...................
speeter机器人#6 · 2009/11/30
学习~