類(lèi)和結(jié)構(gòu)是.NET Framework中的同樣類(lèi)型系統(tǒng)的兩種基本構(gòu)造杭攻。兩者在本質(zhì)上都屬于數(shù)據(jù)結(jié)構(gòu),封裝這一組整體作為一個(gè)邏輯單位的數(shù)據(jù)和行為。數(shù)據(jù)和行為是該類(lèi)或結(jié)構(gòu)的“成員”,它們包含著各自的方法培慌,屬性和事件等。
結(jié)構(gòu)
結(jié)構(gòu)是C#程序員用來(lái)定義自己的值類(lèi)型的最普遍的機(jī)制夏哭。結(jié)構(gòu)比枚舉更強(qiáng)大检柬,因?yàn)樗峁┓椒ǎ侄问洌僮鞣驮L(fǎng)問(wèn)控制等何址。
結(jié)構(gòu)與類(lèi)很相似,都表示可以包含數(shù)據(jù)成員和函數(shù)成員的數(shù)據(jù)結(jié)構(gòu)进胯。但是用爪,與類(lèi)不同,結(jié)構(gòu)是一種值類(lèi)型胁镐,并且不需要堆分配偎血。結(jié)構(gòu)類(lèi)型的變量直接包含了該結(jié)構(gòu)的數(shù)據(jù),而類(lèi)類(lèi)型的變量所包含的只是對(duì)相應(yīng)數(shù)據(jù)的一個(gè)引用(被引用的數(shù)據(jù)稱(chēng)為“對(duì)象”)盯漂。
結(jié)構(gòu)對(duì)于具有值語(yǔ)義的小型數(shù)據(jù)結(jié)構(gòu)尤為有用颇玷。復(fù)數(shù),坐標(biāo)系中的點(diǎn)或字典中的“鍵-值”對(duì)都是結(jié)構(gòu)的典型示例就缆。這些數(shù)據(jù)結(jié)構(gòu)的關(guān)鍵之處在于:他們只是少量數(shù)據(jù)成員帖渠,不要求使用繼承或引用標(biāo)識(shí),而且它們使用較方便(賦值時(shí)直接復(fù)制值而不是復(fù)制它的引用)竭宰。
結(jié)構(gòu)的聲明通過(guò)關(guān)鍵字struct來(lái)實(shí)現(xiàn)空郊,聲明格式為:
修飾符? struct? 結(jié)構(gòu)名
{
結(jié)構(gòu)主體
};
結(jié)構(gòu)聲明包含一組可選額特性份招,后跟一組可選的結(jié)構(gòu)修飾符,再跟關(guān)鍵字struct和一個(gè)用于命名結(jié)構(gòu)的標(biāo)識(shí)符狞甚,然后跟一個(gè)可選的結(jié)構(gòu)接口規(guī)范锁摔,最后跟一個(gè)結(jié)構(gòu)主體,根據(jù)需要后面還可以跟一個(gè)分號(hào)哼审。
結(jié)構(gòu)聲明可以根據(jù)需要包含一個(gè)結(jié)構(gòu)修飾符:new谐腰,public,protected棺蛛,internal怔蚌,private
結(jié)構(gòu)的使用
為結(jié)構(gòu)定義默認(rèn)(無(wú)參數(shù))構(gòu)造函數(shù)是錯(cuò)誤的巩步,在結(jié)構(gòu)體重初始化實(shí)例字段也是錯(cuò)誤的旁赊。初始化結(jié)構(gòu)成員可通過(guò)兩種形式來(lái)完成:一是使用參數(shù)化構(gòu)造函數(shù),二是在聲明結(jié)構(gòu)后分別訪(fǎng)問(wèn)成員椅野。對(duì)于任何私有成員或以其他方式設(shè)置為不可訪(fǎng)問(wèn)的成員终畅,只能在構(gòu)造函數(shù)中進(jìn)行初始化。
如果使用new運(yùn)算符創(chuàng)建結(jié)構(gòu)對(duì)象竟闪,則會(huì)創(chuàng)建該結(jié)構(gòu)對(duì)象离福,并調(diào)用適當(dāng)?shù)臉?gòu)造函數(shù)。與類(lèi)不同的是炼蛤,結(jié)構(gòu)的實(shí)例化可以不使用new運(yùn)算符妖爷。在此情況下不存在構(gòu)造函數(shù)的調(diào)用,因而可以提高分配效率理朋。但是絮识,在初始化所有字段之前,字段將保持未賦值狀態(tài)且對(duì)象不可用嗽上。
當(dāng)結(jié)構(gòu)包含引用類(lèi)型作為成員時(shí)次舌,必須顯式調(diào)用調(diào)用該成員的默認(rèn)構(gòu)造函數(shù),否則該成員將保持未賦值狀態(tài)且該結(jié)構(gòu)不可用兽愤。
例題彼念,創(chuàng)建一個(gè)結(jié)構(gòu),分析結(jié)構(gòu)的使用
類(lèi)
類(lèi)是一種數(shù)據(jù)結(jié)構(gòu)浅萧,它可以封裝數(shù)據(jù)成員(常量和字段)逐沙,函數(shù)成員(方法,屬性洼畅,事件吩案,索引器,運(yùn)算符土思,實(shí)例構(gòu)造函數(shù)务热,靜態(tài)構(gòu)造函數(shù)和析構(gòu)函數(shù))和其他的類(lèi)(嵌套類(lèi)型)忆嗜。類(lèi)是創(chuàng)建對(duì)象的模板。C#的一切類(lèi)型都是類(lèi)崎岂,所有的語(yǔ)句都必須位于類(lèi)內(nèi)捆毫,不存在任何處于類(lèi)外的語(yǔ)句。因此冲甘,類(lèi)是C#語(yǔ)言的核心和基本構(gòu)成模塊绩卤。類(lèi)類(lèi)型支持繼承,繼承是一種機(jī)制江醇,可使派生類(lèi)對(duì)基類(lèi)進(jìn)行擴(kuò)展和專(zhuān)用化濒憋。
類(lèi)聲明中指定的基類(lèi)可以是構(gòu)造類(lèi)類(lèi)型√找梗基類(lèi)本身不能是類(lèi)型形參凛驮,但在其作用域中可以包含類(lèi)型形參。
在OOP方法中条辟,類(lèi)是對(duì)現(xiàn)實(shí)世界的一種高度抽象與概括黔夭,而對(duì)象則是類(lèi)的一個(gè)實(shí)例,對(duì)象一定具有其屬類(lèi)的共同特征與行為規(guī)則羽嫡,當(dāng)然一個(gè)對(duì)象還可以具有其屬類(lèi)未曾規(guī)定的特征和行為規(guī)則本姥。這一點(diǎn)和現(xiàn)實(shí)生活是相同的,這樣的模擬和抽象比較符合人們的思維習(xí)慣杭棵,這也正是OOP方法具有強(qiáng)大生命力婚惫,能夠獲得越來(lái)越多的軟件工作者歡迎并得到眾多計(jì)算機(jī)開(kāi)發(fā)商支持的一個(gè)基本原因。
總之魂爪,從程序設(shè)計(jì)者的角度觀(guān)察先舷,類(lèi)是一個(gè)數(shù)據(jù)模式和若干個(gè)程序過(guò)程,經(jīng)封裝而形成的一個(gè)整體甫窟,是使用信息技術(shù)對(duì)現(xiàn)實(shí)世界的一種模擬與抽象密浑。而對(duì)象則是類(lèi)的一個(gè)實(shí)例,從程序設(shè)計(jì)語(yǔ)言來(lái)說(shuō)粗井,對(duì)象可以被理解為一個(gè)類(lèi)賦值的結(jié)果尔破。對(duì)象是OOP方法中組成程序的一種構(gòu)件。
C#中類(lèi)的聲明是通過(guò)class關(guān)鍵字實(shí)例的浇衬,格式為:
修飾符? class 類(lèi)名: 基類(lèi)或接口
{
類(lèi)體
}
其中“修飾符”,": 基類(lèi)或接口"為可選項(xiàng)懒构。類(lèi)的修飾符可以是以下幾種之一或者它們的組合(在類(lèi)的聲明()中同一修飾符不允許出現(xiàn)多次)。
(1)new:僅允許在嵌套類(lèi)聲明時(shí)使用耘擂,表明類(lèi)中隱藏了由基類(lèi)中繼承而來(lái)的胆剧,與基類(lèi)中同名的成員
(2)public:表示不限制對(duì)該類(lèi)的訪(fǎng)問(wèn)
(3)internal:只有其所在類(lèi)才能訪(fǎng)問(wèn)
(4)private:只有對(duì).NET中的應(yīng)用程序或庫(kù)才能訪(fǎng)問(wèn)
(5)abstract:抽象類(lèi),不允許建立類(lèi)的實(shí)例
(6)sealed:密封類(lèi),不允許被繼承
類(lèi)的繼承聲明:C#語(yǔ)言中只支持單繼承
(1)秩霍、構(gòu)造函數(shù)和析構(gòu)函數(shù)
C#提供了更好的機(jī)制來(lái)增強(qiáng)程序的安全性篙悯。C#編譯器具有嚴(yán)格的類(lèi)型安全檢查功能,它幾乎能找出程序中所有的語(yǔ)法問(wèn)題铃绒。但是鸽照,程序通過(guò)了編譯檢查并不表示錯(cuò)誤已經(jīng)不存在了。
C#語(yǔ)言充分考慮了程序錯(cuò)誤的出現(xiàn)并很好的予以解決颠悬,即把對(duì)象的初始化工作放在構(gòu)造函數(shù)中矮燎,把清除工作放在析構(gòu)函數(shù)中。當(dāng)對(duì)象被創(chuàng)建時(shí)赔癌,構(gòu)造函數(shù)被自動(dòng)執(zhí)行诞外。當(dāng)對(duì)象消亡時(shí),析構(gòu)函數(shù)自動(dòng)執(zhí)行灾票。
構(gòu)造函數(shù)的名字不能隨便起峡谊,必須讓編譯器認(rèn)得出才可以被自動(dòng)執(zhí)行。它的命名方法既簡(jiǎn)單又合理:讓構(gòu)造函數(shù)與類(lèi)名相同铝条。除了名字之外靖苇,構(gòu)造函數(shù)的另一個(gè)特別之處是沒(méi)有返回值類(lèi)型席噩,這是與返回值類(lèi)型為void的函數(shù)不同班缰。
析構(gòu)函數(shù)是實(shí)現(xiàn)銷(xiāo)毀一個(gè)類(lèi)的實(shí)例的方法成員。析構(gòu)函數(shù)不能有參數(shù)悼枢,不能有任何修飾符而且不能被調(diào)用埠忘。析構(gòu)函數(shù)與構(gòu)造函數(shù)目的不同,特在析構(gòu)函數(shù)前加前綴”~“以示區(qū)別馒索。
構(gòu)造函數(shù)和析構(gòu)函數(shù)雖然是一個(gè)類(lèi)中形式上較簡(jiǎn)單的函數(shù)莹妒。但它們的使用決非看上去那么簡(jiǎn)單,因此靈活而正確地使用構(gòu)造函數(shù)和析構(gòu)函數(shù)能夠幫助用戶(hù)更好的理解CLR的內(nèi)存管理機(jī)制以及更好的管理系統(tǒng)中的資源绰上。
(2)旨怠、類(lèi)與對(duì)象
類(lèi)是具有相同屬性和服務(wù)的一組對(duì)象的集合。它為屬于該類(lèi)的所有對(duì)象提供了統(tǒng)一的抽象描述蜈块,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分鉴腻。在面向?qū)ο蟮木幊陶Z(yǔ)言中,類(lèi)是一個(gè)獨(dú)立的程序單位百揭,它有一個(gè)類(lèi)名爽哎,類(lèi)名包括屬性說(shuō)明和服務(wù)說(shuō)明兩個(gè)主要部分。
對(duì)象時(shí)系統(tǒng)中用來(lái)描述客觀(guān)事物的一個(gè)實(shí)體器一,是構(gòu)成系統(tǒng)的一個(gè)基本單位课锌。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)組成。從更抽象的角度來(lái)說(shuō)祈秕,對(duì)象是問(wèn)題域或?qū)崿F(xiàn)域中某些事物的一個(gè)抽象渺贤,反映了該事物在系統(tǒng)中需要保存的信息和發(fā)揮的作用雏胃,是一組屬性和有權(quán)對(duì)這些屬性進(jìn)行操作的一組服務(wù)的封裝體≈景埃客觀(guān)世界是由對(duì)象和對(duì)象之間的聯(lián)系組成的丑掺。
類(lèi)和對(duì)象的關(guān)系就如模具和鑄件的關(guān)系,類(lèi)的實(shí)例化的結(jié)果就是對(duì)象述雾。而對(duì)一類(lèi)對(duì)象的抽象就是類(lèi)街州。類(lèi)描述了一組有相同特性(屬性)和相同行為(方法)的對(duì)象。溫馨提示:如需預(yù)約免費(fèi)試聽(tīng)課程玻孟,請(qǐng)將姓名唆缴,聯(lián)系方式,以及預(yù)約的課程發(fā)送至以下手機(jī)黍翎、QQ面徽、或微信,如有疑問(wèn)也可撥打熱線(xiàn)電話(huà)匣掸。報(bào)名咨詢(xún)熱線(xiàn):15112251330? ? QQ:1358148771? ? 微信:1358148771