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;}