property是指类向外提供的数据区域。
而attribute则是描述对象在编译时或运行时属性的,分为固有型和用户自定义型,其中用户自定义型能够利用Reflection在运行期获取。
这二者是有本质区别的。编程
资料上说两者一个是service的属性,而另外一个是interface的。数组
第一种好象更准确,摘要以下:安全
在不少人的脑海中,Attribute就是类的属性,Property呢?好像也是类的属性?所以有不少人不加区别的统一称为类的属性,尤为是在写中文文章的时候。这种心理是典型的鸵鸟心态,眼不见为净。其实稍微用脚想一下就知道,事实确定不是这样的,UML中既然发明了这两个术语,显然不是用来冗余的。它们之间确定有着千丝万缕的联系与区别。多线程
各类各样的面向对象语言、各类组件技术、模板技术、Web Service技术,其中大部分涉及到了“属性”这个概念,而其英文术语则经常是Attribute、Property或者Field。不少人一律称之为“属性”,有的地方确实能够不加区分,但有的地方倒是差之毫厘、谬以千里。我对于这些纷纷扰扰的技术和术语也很苦恼,可是咱们至少能够经过UML中的这两个术语的解释找到一个能够参考的标准。不管如何,UML是面向对象技术的集大成者和事实上的标准。编程语言
很客观的说,UML1.4中对于这两个术语并无很清晰的定义,可是其区别仍是显而易见的。Attribute应该是UML1.4中的宠儿,而Property连一个单独的术语都没有捞到。谁也没想到在UML2.0中风云突变,Attribute从类图中消失了,而Property冠冕堂皇入主中原。布局
1。4中 Attribute是与Classifier相关联的术语,它比Property的影响范围要小。Class是Classifier的子类,所以Attribute也能够表示Class的属性。从上面的定义还能够看出,Attribute能够是Classifier的实例的命名的槽。对于Class来讲,其实例就是Object,Object的槽就是对象的属性值槽。所以,Attribute是能够做为对象的属性的。而Property彷佛没有这一层的含义。按MOF(元对象设施,OMG的另外一个规范,后面会有详细解释)的模型层次划分,Attribute涉及的模型层从M2到M0,而Property彷佛只是M2层的概念。spa
2。0中 Attribute这里仅仅指一个类元的结构特征,能够将类元的实例联系到一个或者一组具体值。而没有提到实例的槽(slot)等等。我猜测,这是由于UML2.0中已经把Attribute做为Property的一个子集了,因此关于实例的槽(slot)等等的具体赋值方法,都归结到Property的定义中解释了。线程
另一点值得注意的是,Attribute的定义来自于术语表,而没有在元模型图中出现。而Property出如今元模型图中,而且都作了详细而具体的解释。这一点能够看出,UML强化Property,弱化Attribute的决心。翻译
这一节对Attribute和Property做一个小结,基于目前最新的UML2.0规范:code
1) 整体上来讲,Attribute是Property的子集,Property会在适当的时机表现为Attribute;
2) Property出如今类图的元模型中,表明了Class的全部结构化特征;Attribute没有出如今元模型中,它仅仅在Class的概念中存在,没有相应的语法了;
3) Property有详细的定义和约束,而Attribute没有详细的定义,所以也不能用OCL写出其约束。
4)Property和Attribute都是M2层的概念。在M1层,它们的实例是具体类的属性;在M0层,它们的实例的实例是具体对象的槽中存储的值。
对于property和attribute这两个名词都叫“属性”的问题,来源于国内it书籍翻译界的疏忽。
预约义的属性
|
有效目标
|
说明
|
AttributeUsage
|
Class
|
指定另外一个属性类的有效使用方式
|
CLSCompliant
|
所有
|
指出程序元素是否与CLS兼容
|
Conditional
|
Method
|
指出若是没有定义相关联的字符串,编译器就能够忽略对这个方法的任何调用
|
DllImport
|
Method
|
指定包含外部方法的实现的DLL位置
|
STAThread
|
Method(Main)
|
指出程序的默认线程模型为STA
|
MTAThread
|
Method(Main)
|
指出程序的默认模型为多线程(MTA)
|
Obsolete
|
除了Assembly、Module、Parameter和Return
|
将一个元素标示为不可用,通知用户此元素将被从将来的产品
|
ParamArray
|
Parameter
|
容许单个参数被隐式地看成params(数组)参数对待
|
Serializable
|
Class、Struct、enum、delegate
|
指定这种类型的全部公共和私有字段能够被串行化
|
NonSerialized
|
Field
|
应用于被标示为可串行化的类的字段,指出这些字段将不可被串行化
|
StructLayout
|
Class、struct
|
指定类或结构的数据布局的性质,好比Auto、Explicit或sequential
|
ThreadStatic
|
Field(静态)
|
实现线程局部存储(TLS)。不能跨多个线程共享给定的静态字段,每一个线程拥有这个静态字段的副本
|
private int hour; //定义私有变量表示"小时",外部是访问不到的.} public int Hour// 定义Hour程序接口 { set { hour=value; } get { return hour;}