輕松學(xué)習(xí)C#的結(jié)構(gòu)和類
類和結(jié)構(gòu)是.NET Framework中的同樣類型系統(tǒng)的兩種基本構(gòu)造。兩者在本質(zhì)上都屬于數(shù)據(jù)結(jié)構(gòu),封裝這一組整體作為一個(gè)邏輯單位的數(shù)據(jù)和行為。數(shù)據(jù)和行為是該類或結(jié)構(gòu)的“成員”,它們包含著各自的方法,屬性和事件等。
結(jié)構(gòu)
結(jié)構(gòu)是C#程序員用來(lái)定義自己的值類型的最普遍的機(jī)制。結(jié)構(gòu)比枚舉更強(qiáng)大,因?yàn)樗峁┓椒?,字段,操作符和訪問(wèn)控制等。
結(jié)構(gòu)與類很相似,都表示可以包含數(shù)據(jù)成員和函數(shù)成員的數(shù)據(jù)結(jié)構(gòu)。但是,與類不同,結(jié)構(gòu)是一種值類型,并且不需要堆分配。結(jié)構(gòu)類型的變量直接包含了該結(jié)構(gòu)的數(shù)據(jù),而類類型的變量所包含的只是對(duì)相應(yīng)數(shù)據(jù)的一個(gè)引用(被引用的數(shù)據(jù)稱為“對(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)后分別訪問(wèn)成員。對(duì)于任何私有成員或以其他方式設(shè)置為不可訪問(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ù)。與類不同的是,結(jié)構(gòu)的實(shí)例化可以不使用new運(yùn)算符。在此情況下不存在構(gòu)造函數(shù)的調(diào)用,因而可以提高分配效率。但是,在初始化所有字段之前,字段將保持未賦值狀態(tài)且對(duì)象不可用。
當(dāng)結(jié)構(gòu)包含引用類型作為成員時(shí),必須顯式調(diào)用調(diào)用該成員的默認(rèn)構(gòu)造函數(shù),否則該成員將保持未賦值狀態(tài)且該結(jié)構(gòu)不可用。
例題,創(chuàng)建一個(gè)結(jié)構(gòu),分析結(jié)構(gòu)的使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Text { struct Sum//定義的一個(gè)結(jié)構(gòu) { public int sum(int a, int b)//結(jié)構(gòu)包含的方法 { return a + b; } } class Program { static void Main(string[] args) { int p = 10; int q = 10; Sum t = new Sum();//創(chuàng)建結(jié)構(gòu)對(duì)象t Console.Write("{0}+{1}=",p,q); Console.Write(t.sum(p,q));//調(diào)用結(jié)構(gòu)中的方法 Console.ReadLine(); } } }
輸出的結(jié)果為:10+10=20
類
類是一種數(shù)據(jù)結(jié)構(gòu),它可以封裝數(shù)據(jù)成員(常量和字段),函數(shù)成員(方法,屬性,事件,索引器,運(yùn)算符,實(shí)例構(gòu)造函數(shù),靜態(tài)構(gòu)造函數(shù)和析構(gòu)函數(shù))和其他的類(嵌套類型)。類是創(chuàng)建對(duì)象的模板。C#的一切類型都是類,所有的語(yǔ)句都必須位于類內(nèi),不存在任何處于類外的語(yǔ)句。因此,類是C#語(yǔ)言的核心和基本構(gòu)成模塊。類類型支持繼承,繼承是一種機(jī)制,可使派生類對(duì)基類進(jìn)行擴(kuò)展和專用化。
類聲明中指定的基類可以是構(gòu)造類類型?;惐旧聿荒苁穷愋托螀ⅲ谄渥饔糜蛑锌梢园愋托螀?。
在OOP方法中,類是對(duì)現(xiàn)實(shí)世界的一種高度抽象與概括,而對(duì)象則是類的一個(gè)實(shí)例,對(duì)象一定具有其屬類的共同特征與行為規(guī)則,當(dāng)然一個(gè)對(duì)象還可以具有其屬類未曾規(guī)定的特征和行為規(guī)則。這一點(diǎn)和現(xiàn)實(shí)生活是相同的,這樣的模擬和抽象比較符合人們的思維習(xí)慣,這也正是OOP方法具有強(qiáng)大生命力,能夠獲得越來(lái)越多的軟件工作者歡迎并得到眾多計(jì)算機(jī)開(kāi)發(fā)商支持的一個(gè)基本原因。
總之,從程序設(shè)計(jì)者的角度觀察,類是一個(gè)數(shù)據(jù)模式和若干個(gè)程序過(guò)程,經(jīng)封裝而形成的一個(gè)整體,是使用信息技術(shù)對(duì)現(xiàn)實(shí)世界的一種模擬與抽象。而對(duì)象則是類的一個(gè)實(shí)例,從程序設(shè)計(jì)語(yǔ)言來(lái)說(shuō),對(duì)象可以被理解為一個(gè)類賦值的結(jié)果。對(duì)象是OOP方法中組成程序的一種構(gòu)件。
C#中類的聲明是通過(guò)class關(guān)鍵字實(shí)例的,格式為:
修飾符 class 類名: 基類或接口
{
類體
}
其中“修飾符”,": 基類或接口"為可選項(xiàng)。類的修飾符可以是以下幾種之一或者它們的組合(在類的聲明()中同一修飾符不允許出現(xiàn)多次)。
(1)new:僅允許在嵌套類聲明時(shí)使用,表明類中隱藏了由基類中繼承而來(lái)的,與基類中同名的成員
(2)public:表示不限制對(duì)該類的訪問(wèn)
(3)internal:只有其所在類才能訪問(wèn)
(4)private:只有對(duì).NET中的應(yīng)用程序或庫(kù)才能訪問(wèn)
(5)abstract:抽象類,不允許建立類的實(shí)例
(6)sealed:密封類,不允許被繼承
使用new關(guān)鍵字可以建立類的一個(gè)實(shí)例:
class A { } class B { void M() { A a = new A(); } }
類的繼承聲明:C#語(yǔ)言中只支持單繼承
class A { } class B : A { }
(1)、構(gòu)造函數(shù)和析構(gòu)函數(shù)
C#提供了更好的機(jī)制來(lái)增強(qiáng)程序的安全性。C#編譯器具有嚴(yán)格的類型安全檢查功能,它幾乎能找出程序中所有的語(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ù)與類名相同。除了名字之外,構(gòu)造函數(shù)的另一個(gè)特別之處是沒(méi)有返回值類型,這是與返回值類型為void的函數(shù)不同。
析構(gòu)函數(shù)是實(shí)現(xiàn)銷毀一個(gè)類的實(shí)例的方法成員。析構(gòu)函數(shù)不能有參數(shù),不能有任何修飾符而且不能被調(diào)用。析構(gòu)函數(shù)與構(gòu)造函數(shù)目的不同,特在析構(gòu)函數(shù)前加前綴”~“以示區(qū)別。
構(gòu)造函數(shù)和析構(gòu)函數(shù)雖然是一個(gè)類中形式上較簡(jiǎn)單的函數(shù)。但它們的使用決非看上去那么簡(jiǎn)單,因此靈活而正確地使用構(gòu)造函數(shù)和析構(gòu)函數(shù)能夠幫助用戶更好的理解CLR的內(nèi)存管理機(jī)制以及更好的管理系統(tǒng)中的資源。
(2)、類與對(duì)象
類是具有相同屬性和服務(wù)的一組對(duì)象的集合。它為屬于該類的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z(yǔ)言中,類是一個(gè)獨(dú)立的程序單位,它有一個(gè)類名,類名包括屬性說(shuō)明和服務(wù)說(shuō)明兩個(gè)主要部分。
對(duì)象時(shí)系統(tǒng)中用來(lái)描述客觀事物的一個(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ù)的封裝體。客觀世界是由對(duì)象和對(duì)象之間的聯(lián)系組成的。
類和對(duì)象的關(guān)系就如模具和鑄件的關(guān)系,類的實(shí)例化的結(jié)果就是對(duì)象。而對(duì)一類對(duì)象的抽象就是類。類描述了一組有相同特性(屬性)和相同行為(方法)的對(duì)象。
例題,創(chuàng)建類A并且在另一個(gè)類中調(diào)用類A的方法Sum
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Text { class A//創(chuàng)建的類 { public int Sum(int i, int j)//被類封裝的方法 { return i + j; } } class Program { static void Main(string[] args) { A a = new A();//創(chuàng)建的類A的對(duì)象a int p = 10; int q = 10; Console.WriteLine(a.Sum(p,q));//調(diào)用類A的Sum方法 Console.ReadLine(); } } }
輸出的結(jié)果為:20
以上就是關(guān)于C#的結(jié)構(gòu)和類的全部知識(shí)點(diǎn),希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
WPF實(shí)現(xiàn)帶篩選功能的DataGrid
在默認(rèn)情況下,WPF提供的DataGrid僅擁有數(shù)據(jù)展示等簡(jiǎn)單功能,如果要實(shí)現(xiàn)像Excel一樣復(fù)雜的篩選過(guò)濾功能,則相對(duì)比較麻煩。本文以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述如何通過(guò)WPF實(shí)現(xiàn)DataGrid的篩選功能,僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正2023-03-03c# 重載WndProc,實(shí)現(xiàn)重寫“最小化”的實(shí)現(xiàn)方法
在做“亦歌桌面版”的時(shí)候,發(fā)現(xiàn)當(dāng)打開(kāi)歌詞狀態(tài)下,用最小化隱藏窗體到托盤的話(如下code #1),在調(diào)出發(fā)現(xiàn)歌詞縮小了(雖然顯現(xiàn)的窗體大小跟剛才一樣),從這點(diǎn)看調(diào)用該方法其實(shí)窗體大小是改變了的(這個(gè)過(guò)程只是不可視而已)。2009-02-02Unity工具類ScrollView實(shí)現(xiàn)拖拽滑動(dòng)翻頁(yè)
這篇文章主要為大家詳細(xì)介紹了Unity工具類ScrollView實(shí)現(xiàn)拖拽滑動(dòng)翻頁(yè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04WPF 在image控件用鼠標(biāo)拖拽出矩形的實(shí)現(xiàn)方法
這篇文章主要介紹了WPF 在image控件用鼠標(biāo)拖拽出矩形的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08C#實(shí)現(xiàn)將漢字轉(zhuǎn)化為2位大寫的16進(jìn)制Unicode的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將漢字轉(zhuǎn)化為2位大寫的16進(jìn)制Unicode的方法,分析了轉(zhuǎn)換的技巧并以實(shí)例形式給出了具體的轉(zhuǎn)換方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12C#實(shí)現(xiàn)簡(jiǎn)單合并word文檔的方法
這篇文章主要介紹了C#實(shí)現(xiàn)簡(jiǎn)單合并word文檔的方法,涉及C#針對(duì)word文檔的讀取、插入、保存等技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-09-09C#事件標(biāo)準(zhǔn)命名規(guī)則及說(shuō)明(包括用作事件類型的委托命名)
這篇文章主要介紹了C#事件標(biāo)準(zhǔn)命名規(guī)則及說(shuō)明(包括用作事件類型的委托命名),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02