類和結構是.NET Framework中的同樣類型系統的兩種基本構造。兩者在本質上都屬於資料結構,封裝這一組整體作為一個邏輯單位的資料和行為。資料和行為是該類或結構的“成員”,它們包含著各自的方法,屬性和事件等。
結構
結構是C#程式員用來定義自己的實值型別的最普遍的機制。結構比枚舉更強大,因為它提供方法,欄位,操作符和存取控制等。
結構與類很相似,都表示可以包含資料成員和函數成員的資料結構。但是,與類不同,結構是一種實值型別,並且不需要堆分配。結構類型的變數直接包含了該結構的資料,而類類型的變數所包含的只是對相應資料的一個引用(被引用的資料稱為“對象”)。
結構對於具有值語義的小型資料結構尤為有用。複數,座標系中的點或字典中的“鍵-值”對都是結構的典型樣本。這些資料結構的關鍵之處在於:他們只是少量資料成員,不要求使用繼承或引用標識,而且它們使用較方便(賦值時直接複製值而不是複製它的引用)。
結構的聲明通過關鍵字struct來實現,聲明格式為:
修飾符 struct 結構名
{
結構主體
};
結構聲明包含一組可選額特性,後跟一組可選的結構修飾符,再跟關鍵字struct和一個用於命名結構的標識符,然後跟一個可選的結構介面規範,最後跟一個結構主體,根據需要後面還可以跟一個分號。
結構聲明可以根據需要包含一個結構修飾符:new,public,protected,internal,private
結構的使用
為結構定義預設(無參數)建構函式是錯誤的,在結構體重初始化執行個體欄位也是錯誤的。初始化結構成員可通過兩種形式來完成:一是使用參數化建構函式,二是在聲明結構後分別訪問成員。對於任何私人成員或以其他方式設定為不可訪問的成員,只能在建構函式中進行初始化。
如果使用new運算子建立結構對象,則會建立該結構對象,並調用適當的建構函式。與類不同的是,結構的執行個體化可以不使用new運算子。在此情況下不存在建構函式的調用,因而可以提高分配效率。但是,在初始化所有欄位之前,欄位將保持未賦值狀態且對象不可用。
當結構包含參考型別作為成員時,必須顯式調用調用該成員的預設建構函式,否則該成員將保持未賦值狀態且該結構不可用。
例題,建立一個結構,分析結構的使用
類
類是一種資料結構,它可以封裝資料成員(常量和欄位),函數成員(方法,屬性,事件,索引器,運算子,執行個體建構函式,靜態建構函式和解構函式)和其他的類(巢狀型別)。類是建立對象的模板。C#的一切類型都是類,所有的語句都必須位於類內,不存在任何處於類外的語句。因此,類是C#語言的核心和基本構成模組。類類型支援繼承,繼承是一種機制,可使衍生類別對基類進行擴充和專用化。
類聲明中指定的基類可以是構造類類型。基類本身不能是類型形參,但在其範圍中可以包含類型形參。
在OOP方法中,類是對現實世界的一種高度抽象與概括,而對象則是類的一個執行個體,對象一定具有其屬類的共同特徵與行為規則,當然一個對象還可以具有其屬類未曾規定的特徵和行為規則。這一點和現實生活是相同的,這樣的類比和抽象比較符合人們的思維習慣,這也正是OOP方法具有強大生命力,能夠獲得越來越多的軟體工作者歡迎並得到眾多電腦開發商支援的一個基本原因。
總之,從程式設計者的角度觀察,類是一個資料模式和若干個程式過程,經封裝而形成的一個整體,是使用資訊技術對現實世界的一種類比與抽象。而對象則是類的一個執行個體,從程式設計語言來說,對象可以被理解為一個類賦值的結果。對象是OOP方法中組成程式的一種構件。
C#中類的聲明是通過class關鍵字執行個體的,格式為:
修飾符 class 類名: 基類或介面
{
類體
}
其中“修飾符”,": 基類或介面"為可選項。類的修飾符可以是以下幾種之一或者它們的組合(在類的聲明()中同一修飾符不允許出現多次)。
(1)new:僅允許在嵌套類聲明時使用,表明類中隱藏了由基類中繼承而來的,與基類中同名的成員
(2)public:表示不限制對該類的訪問
(3)internal:只有其所在類才能訪問
(4)private:只有對.NET中的應用程式或庫才能訪問
(5)abstract:抽象類別,不允許建立類的執行個體
(6)sealed:密封類,不允許被繼承
類的繼承聲明:C#語言中只支援單繼承
(1)、建構函式和解構函式
C#提供了更好的機制來增強程式的安全性。C#編譯器具有嚴格的型別安全檢查功能,它幾乎能找出程式中所有的文法問題。但是,程式通過了編譯檢查並不表示錯誤已經不存在了。
C#語言充分考慮了程式錯誤的出現並很好的予以解決,即把對象的初始化工作放在建構函式中,把清除工作放在解構函式中。當對象被建立時,建構函式被自動執行。當對象消亡時,解構函式自動執行。
建構函式的名字不能隨便起,必須讓編譯器認得出才可以被自動執行。它的命名方法既簡單又合理:讓建構函式與類名相同。除了名字之外,建構函式的另一個特別之處是沒有傳回值類型,這是與傳回值類型為void的函數不同。
解構函式是實現銷毀一個類的執行個體的方法成員。解構函式不能有參數,不能有任何修飾符而且不能被調用。解構函式與建構函式目的不同,特在解構函式前加首碼”~“以示區別。
建構函式和解構函式雖然是一個類中形式上較簡單的函數。但它們的使用決非看上去那麼簡單,因此靈活而正確地使用建構函式和解構函式能夠協助使用者更好的理解CLR的記憶體管理機制以及更好的管理系統中的資源。
(2)、類與對象
類是具有相同屬性和服務的一組對象的集合。它為屬於該類的所有對象提供了統一的抽象描述,其內部包括屬性和服務兩個主要部分。在物件導向的程式設計語言中,類是一個獨立的程式單位,它有一個類名,類名包括屬性說明和服務說明兩個主要部分。
對象時系統中用來描述客觀事物的一個實體,是構成系統的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務組成。從更抽象的角度來說,對象是問題域或實現域中某些事物的一個抽象,反映了該事物在系統中需要儲存的資訊和發揮的作用,是一組屬性和有權對這些屬性進行操作的一組服務的封裝體。客觀世界是由對象和對象之間的聯絡組成的。
類和對象的關係就如模具和鑄件的關係,類的執行個體化的結果就是對象。而對一類對象的抽象就是類。類描述了一組有相同特性(屬性)和相同行為(方法)的對象。