天天看點

C#中域與屬性的差別

域   域(Field)又稱成員變量(Member Variable),它表示存儲位置,是C#中類不可缺少的一部分。域的類型可以是C#中任何資料類型。但對于除去string類型的其他引用類型由于在初始化時涉及到一些類的構造器的操作。   域分為執行個體域和靜态域。執行個體域屬于具體的對象,為特定的對象所專有。靜态域屬于類,為所有對象所共用。C#嚴格規定執行個體域隻能通過對象來擷取,靜态域隻能通過類來擷取。例如我們有一個類型為MyClass的對象MyObject,MyClass内的執行個體域instanceField(存取限制為public)隻能這樣擷取:MyObject. instanceField。而MyClass的靜态域staticField(存取限制為public)隻能這樣擷取:MyClass.staticField。注意靜态域不能像傳統C++那樣通過對象擷取,也就是說MyObject.staticField的用法是錯誤的,不能通過編譯器編譯。   域的存取限制集中展現了面向對象程式設計的封裝原則。如前所述,C#中的存取限制修飾符有5種,這5種對域都适用。C#隻是用internal擴充了C++原來的friend修飾符。在有必要使兩個類的某些域互相可見時,我們将這些類的域聲明為internal,然後将它們放在一個組合體内編譯即可。如果需要對它們的繼承子類也可見的話,聲明為protected internal即可。實際上這也是組合體的本來意思--将邏輯相關的類組合封裝在一起。   C#引入了readonly修飾符來表示隻讀域,const來表示不變常量。顧名思義對隻讀域不能進行寫操作,不變常量不能被修改,這兩者到底有什麼差別呢?隻讀域隻能在初始化--聲明初始化或構造器初始化--的過程中指派,其他地方不能進行對隻讀域的指派操作,否則編譯器會報錯。隻讀域可以是執行個體域也可以是靜态域。隻讀域的類型可以是C#語言的任何類型。但const修飾的常量必須在聲明的同時指派,而且要求編譯器能夠在編譯時期計算出這個确定的值。const修飾的常量為靜态變量,不能夠為對象所擷取。const修飾的值的類型也有限制,它隻能為下列類型之一(或能夠轉換為下列類型的):sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, enum類型, 或引用類型。值得注意的是這裡的引用類型,由于除去string類型外,所有的類型出去null值以外在編譯時期都不能由編譯器計算出他們的确切的值,是以我們能夠聲明為const的引用類型隻能為string或值為null的其他引用類型。顯然當我們聲明一個null的常量時,我們已經失去了聲明的意義--這也可以說是C#軟體設計的尴尬之處! 屬性  屬性可以說是C#語言的一個創新。當然你也可以說不是。不是的原因是它背後的實作實際上還是兩個函數--一個指派函數(get),一個取值函數(set),這從它生成的中間語言代碼可以清晰地看到。是的原因是它的的确确在語言層面實作了面向對象程式設計一直以來對“屬性”這一OO風格的類的特殊接口的訴求。了解屬性的設計初衷是我們用好屬性這一工具的根本。C#不提倡将域的保護級别設為public而使使用者在類外任意操作--那樣太不OO,或者具體點說太不安全!對所有有必要在類外可見的域,C#推薦采用屬性來表達。屬性不表示存儲位置,這是屬性和域的根本性的差別。引自http://cn.88db.com/sz/Knowledge/Knowledge_Detail.page?kid=2764