零點(diǎn)起飛學(xué)C#之結(jié)構(gòu)_第1頁(yè)
零點(diǎn)起飛學(xué)C#之結(jié)構(gòu)_第2頁(yè)
零點(diǎn)起飛學(xué)C#之結(jié)構(gòu)_第3頁(yè)
零點(diǎn)起飛學(xué)C#之結(jié)構(gòu)_第4頁(yè)
零點(diǎn)起飛學(xué)C#之結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第9章 結(jié) 構(gòu)在實(shí)際生活中,我們經(jīng)常把一組相關(guān)的信息放在一起,比如通訊錄的記錄。這樣便于我們記憶和處理。同樣,編程也采納了這種處理模式。在編程中,把一系列相關(guān)的變量組織成為一個(gè)單一實(shí)體的過(guò)程稱就為生成結(jié)構(gòu)的過(guò)程。這個(gè)單一實(shí)體的類型就叫做結(jié)構(gòu)類型,每一個(gè)變量稱為結(jié)構(gòu)的成員。本章將為大家詳細(xì)講解C#語(yǔ)言中的結(jié)構(gòu)。19.1 結(jié) 構(gòu) 概 述結(jié)構(gòu)和類非常相似。類類型是一種引用類型,它的變量?jī)H僅包含訪問(wèn)某個(gè)數(shù)據(jù)的一個(gè)引用(或地址)。但結(jié)構(gòu)是一種值類型,并且不需要堆分配。如果聲明一個(gè)很大的數(shù)組,為了引用每個(gè)對(duì)象,就需要分配更多的內(nèi)存。這種情況下,使用結(jié)構(gòu)可以節(jié)約資源。本節(jié)學(xué)習(xí)結(jié)構(gòu)的聲明和它的修飾符。21結(jié)構(gòu)

2、聲明結(jié)構(gòu)和類一樣,在使用之前需要聲明。聲明結(jié)構(gòu)需要使用struct關(guān)鍵字,語(yǔ)法如下:struct-modifiers struct identifier struct-interfaces struct-body ;struct-modifiers表示結(jié)構(gòu)修飾符(可選),identifier表示結(jié)構(gòu)的名稱,struct-interfaces表示結(jié)構(gòu)的基接口等(可選),struct-body表示結(jié)構(gòu)體,;(分號(hào))是可選的?!臼纠?-1】下面聲明名稱為Str的結(jié)構(gòu)。public struct Str /聲明一個(gè)名為Str的結(jié)構(gòu) /結(jié)構(gòu)體的代碼已經(jīng)省略32結(jié)構(gòu)修飾符和類一樣,結(jié)構(gòu)也需要修飾符去限定它

3、。不同的結(jié)構(gòu),也有不同的訪問(wèn)權(quán)限。C#中有多種修飾符來(lái)表達(dá)結(jié)構(gòu)的不同性質(zhì)。結(jié)構(gòu)修飾符放在struct關(guān)鍵字的前面,它包括new、public、protected、internal和private共5個(gè)關(guān)鍵字。其中,public、protected、internal和private修飾符控制結(jié)構(gòu)的可訪問(wèn)性。它們的意義具體說(shuō)明如下所示。4public修飾符:表示該結(jié)構(gòu)是公開(kāi)的,訪問(wèn)不受限制。protected修飾符:表示該結(jié)構(gòu)只能是本身或其派生的結(jié)構(gòu)訪問(wèn)。internal修飾符:表示該結(jié)構(gòu)只能是在當(dāng)前應(yīng)用程序中訪問(wèn)。private修飾符:表示該結(jié)構(gòu)只能是本身訪問(wèn)。注意:new修飾符可以指定接口隱藏

4、同名的繼承成員。59.2 結(jié) 構(gòu) 成 員結(jié)構(gòu)和類一樣,它也包含多種成員,如常量、字段、方法等。具體說(shuō)明如下所示:常量:用來(lái)表示常數(shù)值。字段:結(jié)構(gòu)的變量。方法:是包含一系列語(yǔ)句的代碼塊,通過(guò)這些代碼塊能夠?qū)崿F(xiàn)預(yù)先定義的計(jì)算或操作。屬性:用于訪問(wèn)對(duì)象或結(jié)構(gòu)的特性的成員。事件:一種使對(duì)象或結(jié)構(gòu)能夠提供通知的成員??蛻舳丝梢酝ㄟ^(guò)提供事件處理程序(event handler)為相應(yīng)的事件添加可執(zhí)行代碼。6索引器:是一種含有參數(shù)的屬性,又稱為含參屬性。它提供索引的方式來(lái)訪問(wèn)對(duì)象,即與數(shù)組的訪問(wèn)方式相同。運(yùn)算符:定義表達(dá)式運(yùn)算符,通過(guò)它可以對(duì)該結(jié)構(gòu)的實(shí)例進(jìn)行運(yùn)算。實(shí)例構(gòu)造函數(shù):不使用static修飾符,用于

5、實(shí)現(xiàn)初始化該結(jié)構(gòu)的實(shí)例所需的操作。靜態(tài)構(gòu)造函數(shù):使用static修飾符,用于實(shí)現(xiàn)初始化該結(jié)構(gòu)自身所需的操作。類型:該結(jié)構(gòu)的局部類型。7上述成員除了類型之外,可以分類兩大類:數(shù)據(jù)成員和函數(shù)成員。其中,數(shù)據(jù)成員包括常量和字段;函數(shù)成員包括方法、屬性、事件、索引器、運(yùn)算符、實(shí)例構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)。注意:由于結(jié)構(gòu)的成員和類的成員非常相似,因此在此不做詳細(xì)介紹,讀者可以參考類成員(第8.2節(jié))。89.3 結(jié)構(gòu)和類的區(qū)別結(jié)構(gòu)和類雖然比較相似,但是還存在以下8個(gè)方面的區(qū)別,如下表所示。區(qū)別項(xiàng)結(jié)構(gòu)類類型值類型引用類型在內(nèi)存中的分配分配在堆棧上分配在堆上默認(rèn)值字段本身類型的默認(rèn)值字段的默認(rèn)值為null無(wú)參數(shù)

6、的構(gòu)造函數(shù)不能聲明可以聲明析構(gòu)函數(shù)不能聲明可以聲明實(shí)例字段的初始化不能可以繼承不存在繼承,但可以實(shí)現(xiàn)接口存在單繼承實(shí)例化時(shí)new運(yùn)算符的使用可以不使用,對(duì)象具有默認(rèn)初始值必須使用,且要給每個(gè)字段賦初值99.3.1 繼承在前面第8.1.3小節(jié)我們簡(jiǎn)單學(xué)習(xí)了類繼承,但是結(jié)構(gòu)不支持繼承。因此,在聲明結(jié)構(gòu)成員時(shí),不能使用protected或protected internal修飾符。結(jié)構(gòu)類型永遠(yuǎn)不會(huì)是抽象的,并且始終是隱式密封的。因此,結(jié)構(gòu)不能作為其他結(jié)構(gòu)或類的基結(jié)構(gòu),而且在聲明結(jié)構(gòu)時(shí),不能使用abstract或sealed修飾符。10【示例9-2】下面聲明名稱為Str的結(jié)構(gòu),它包含兩個(gè)字段:name

7、和age。其中,在聲明age字段時(shí)使用了protected修飾符。public struct Str string name; protected int age; /錯(cuò)誤,不能使用protected修飾符分析:在age的聲明處將產(chǎn)生一個(gè)編譯錯(cuò)誤,錯(cuò)誤信息為“結(jié)構(gòu)中已聲明新的保護(hù)成員”。因此,結(jié)構(gòu)成員是不能用protected修飾的。結(jié)構(gòu)類型隱式地從System.ValueType類繼承(System.ValueType類本身繼承于object類)。在聲明一個(gè)結(jié)構(gòu)時(shí),可以指定該結(jié)構(gòu)實(shí)現(xiàn)多個(gè)接口,但是不能指定基類。11【示例9-3】下面聲明一個(gè)類和一個(gè)結(jié)構(gòu),它們的名稱分別為Program和Str

8、。其中,Str結(jié)構(gòu)繼承自Program類。public class Program /聲明Program類public struct Str:Program /錯(cuò)誤,Str結(jié)構(gòu)不能聲明基類Program string name; /聲明name字段 int age; /聲明age字段12分析:在結(jié)構(gòu)的聲明處將產(chǎn)生一個(gè)編譯錯(cuò)誤,錯(cuò)誤信息為“接口列表中的類型”Program”不是接口”。因?yàn)榻Y(jié)構(gòu)可以實(shí)現(xiàn)接口,但是不支持繼承,它的函數(shù)成員也不能被繼承。因此,在聲明結(jié)構(gòu)的函數(shù)成員時(shí),也不能使用abstract或virtual修飾符。注意:在結(jié)構(gòu)中,可以使用override修飾符重寫(xiě)從System.Va

9、lueType類繼承而來(lái)的方法。139.3.2 this保留字保留字this只能在實(shí)例構(gòu)造函數(shù)、實(shí)例方法或?qū)嵗L問(wèn)器的塊中使用,且表示當(dāng)前實(shí)例。在類的構(gòu)造函數(shù)中出現(xiàn)的this作為一個(gè)值類型,它表示對(duì)正在構(gòu)造的對(duì)象本身的引用。在類的方法中出現(xiàn)的this作為一個(gè)值類型,它表示對(duì)調(diào)用該方法的對(duì)象的引用。但是,在結(jié)構(gòu)的構(gòu)造函數(shù)中出現(xiàn)的this作為一個(gè)變量類型,它表示對(duì)正在構(gòu)造的結(jié)構(gòu)的引用。在結(jié)構(gòu)的方法中出現(xiàn)的this作為一個(gè)變量類型,它表示對(duì)調(diào)用該方法的結(jié)構(gòu)的引用。注意:在結(jié)構(gòu)中時(shí),由于this相當(dāng)于一個(gè)變量,因此,可以對(duì)this賦值,甚至通過(guò)this可能修改其所屬結(jié)構(gòu)的值。149.3.3 構(gòu)造函數(shù)在類中,可以聲明無(wú)參數(shù)的實(shí)例構(gòu)造函數(shù)。但是在結(jié)構(gòu)中,不能聲明無(wú)參數(shù)的實(shí)例構(gòu)造函數(shù)。因?yàn)槊恳粋€(gè)結(jié)構(gòu)都隱式地具有一個(gè)無(wú)參數(shù)實(shí)例構(gòu)造函數(shù),該構(gòu)造函數(shù)無(wú)法更改。默認(rèn)的構(gòu)造函數(shù)將初始化該結(jié)構(gòu)所有字段的值。如果字段的類型為值類型,則將該字段的值設(shè)置為其類型的默認(rèn)值。如果字段的類型為引用類型,則將該字段的值設(shè)置為null。此外,結(jié)構(gòu)還可以聲明帶有參數(shù)的實(shí)例構(gòu)造函數(shù)。【示例9-4】下面程序中聲明名稱為Str的結(jié)構(gòu),它包含兩個(gè)字段:name和age。Str結(jié)構(gòu)還聲明一個(gè)帶有兩個(gè)參數(shù)(name和age)的實(shí)例構(gòu)造函數(shù),并初始化na

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論