天天看點

1 C#中的兩個屬性(Property和Attribute) 差別

Attribute和Property都可以翻譯成“屬性”,有的地方用Attribute表示“屬性”,有的地方又在用Property,初學者常常在這兩個單詞間“迷失”,甚至認為二者沒有差別,是一樣的。可是Attribute不等于Property。二者之間到底有何差別?   我們從OOA/OOD(Object Oriented Analysis / Object Oriented Design,面向對象分析與設計)說起。在OOA/OOD中的使用Attribute表示屬性,指對象(Object)的特征(Feature)。我們在一些程式設計語言(如C#、Delhpi等)中遇到的“屬性”一詞,為何是Property,而不是Attribute呢?   為了了解這一點,我們把C++拽進來看看。OOA/OOD中的Attribute在C++中稱為Member Variable(成員變量),慢慢開始明白了吧。C++中的Member Variable在C#中可以繼續延用,但有了一個新的稱呼:Field(字段)。看一個簡單的C#示例: public class Student {              // Student類     private string name;         // C#中稱為Field(字段),C++中稱為Member Variable(成員變量),OOA/OOD中稱為Attribute(屬性) }   我們整理出下表,可以看到同樣的概念在OOA/OOD、C++和C#中的不同稱呼:

Description OOA/OOD C++ .NET(C#) /Delphi
Feature Attribute Member Variable Field

  OOA/OOD中的方法(Method)是指對象的操作(Operation)。在C++中稱為Member Function(成員函數),而在C#中還是叫做Method。在表中加入對方法(Method)的稱呼:

Description OOA/OOD C++ .NET(C#) /Delphi
Feature Attribute Member Variable Field
Operation Method Member Function Method

  也可以看出,C++中将Attribute稱為Member Variable,将Method稱為Member Function,其實還是很貼切的。從本質上說,确實是在聲明變量、定義函數。後來者(C#等)可能覺得這樣的稱呼不夠OO(Object Oriented,面向對象),于是做了些改變。Method延用OOA/OOD的稱呼不用說,但将Attribute稱作Field,總覺得欠妥。因為DB(Database,資料庫)中有Field的概念,也譯作“字段”,實在是容易混淆。   現在我們可以把OOA/OOD中提到的屬性(Attribute)同C#中提到的屬性(Property)區分開來。繼續上面的示例: public class Student {              // Student類     private string name;         // C#中稱為Field(字段),C++中稱為Member Variable(成員變量),OOA/OOD中稱為Attribute(屬性)     public string Name {          // C#中稱為Property(屬性)         get {             return name;         }         set {             name = value;         }     } }   我們順便看看private和public:Property本質上是一對get/set方法,可以進行通路控制,因而可以設定為public;而按照OOA/OOD原則,Attribute不能設為public,而要設為private。   C#中确實也有Attribute,把它譯作“特性”似乎更好些。如: [WebMethod] 在不少的.NET/C#書籍中看到有把Attribute譯成“屬性”的,這樣一來,老鳥倒是可以通過語境判斷出來不是在說Property,初學者恐怕一下子就跌進雲裡霧裡了。雖然不至于“一個饅頭引發的血案”,但“兩個屬性引發的歧異”,終究不是什麼好事情。   另外,在Web程式設計中也常見到Attribute和Property混用的情況。比如用VS 2003或2005建立一個ASP.NET應用程式,如果在代碼視圖添加控件: <asp:TextBox id=”txtName” text=”Hello” runat=”server” /> 此時TextBox控件中的id、text和runat都稱為Attribute,這是延用了HTML中對屬性(Attribute)的稱呼。   如果是在設計視圖中拖放控件,然後在屬性(Properties)視窗中設定ID或Text,此時又會将ID或Text稱為Property。因為控件在伺服器上是作為控件類(Control Class)實作,使得可以用程式設計的方式來通路控件。那麼屬性必然是Class中的Property。   在我們平日裡使用術語的時候,一定要準确,否則在交流時遇到不必要的障礙。 (1)OOA             OOA在分析需求的時候就引入了對象、類的思想。以對象間互動作為表示實際環境中系統主要運作機制的核心。特别注意,主要的業務算法應該在OOA階段就描述出來(即是不是非常精确的)。     (2)OOD             OOD是在OOA分析出平台無關模型的基礎上,增加進一步的設計因素的過程。其産生的包括易于修改的架構,做出平台相關的決策等。OOD應該劃分出主要子系統/子產品及其精确的接口。     (3)OOP             實作OOD規定的各種接口和子產品。                 注意,三個過程通常會互相影響,不是個簡單的順序關系。這種“非順序的關系”就是軟體過程研究的主要内容。

繼續閱讀