C#從入門到精通-第四章_第1頁
C#從入門到精通-第四章_第2頁
C#從入門到精通-第四章_第3頁
C#從入門到精通-第四章_第4頁
C#從入門到精通-第四章_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章主流軟件開發(fā)方法

——面向?qū)ο笕腴T類的定義和類的成員

對象的創(chuàng)立和使用

分部類

結(jié)構(gòu)和類

命名空間4.1C#中的類面向?qū)ο蟪绦蛟O(shè)計(jì)是目前主流的編程方法,C#是一門純粹的面向?qū)ο蟮恼Z言,面向?qū)ο缶幊痰母资穷惡蛯ο?,類是面向?qū)ο蟪绦蛟O(shè)計(jì)思想的靈魂,下面我們學(xué)習(xí)類的概念。4.1.1類的概念日常生活中,類是對具有相同特征的一類事物的抽象描述,比方水果就是一個(gè)類,它是對蘋果、梨等所有具體水果的抽象描述,而這個(gè)類中所包含的具體的蘋果、梨等個(gè)體就是對象。不同的類具有不同的特征,比方人類、水果類和電腦類分別是不同的類等。4.1.2類的定義類的定義使用class關(guān)鍵字,其語法如下:

[訪問修飾符]class類名

{

//類的主體

}

訪問修飾符在C#中訪問修飾符有4種,它們是:

⑴public:對類的訪問不受限制,就像公共圖書館一樣,誰都可以進(jìn)去看書;

⑵protectecd:對類的訪問僅限于包含類或從包含類派生的類型,就像單位的圖書館,只有該單位或其子公司的人才能進(jìn)去;

⑶private:訪問僅限于包含類型,如私人圖書館一樣不對外開放;類名采用帕斯卡命名法,即首字母大寫,通常命名類采用完整的英文單詞,如Person類,Student類。提示

⑷internal:訪問僅限于當(dāng)前工程,如單位的圖書館除本單位的人能訪問外,外單位排到本單位協(xié)助工作的人也能訪問?!痉独?-1】定義一個(gè)類。classPhone{publicstringbrand;//定義公有的成員表示的品牌publicstringphoneNumber;//定義公有的成員表示的號碼}4.1.3類的成員定義在類名后大括號中的元素都是類的成員。類的主要成員包括描述狀態(tài)的數(shù)據(jù)成員和描述操作的函數(shù)成員。比方在小節(jié)的Phone類中,有機(jī)主、號碼等屬性,這些屬性就是Phone類的數(shù)據(jù)成員,而還有接和撥等功能,這些功能那么屬于函數(shù)成員。

1.數(shù)據(jù)成員常量成員名稱的第一個(gè)字母一般大寫,也經(jīng)常使用全部大寫、多個(gè)字之間用下劃線連接的常量名。提示

類的數(shù)據(jù)成員包括:字段〔或者稱域〕和常量。字段就是在類內(nèi)定義的變量,用來存儲(chǔ)描述類的特征的值,如的顏色、所屬的主人,號碼等。常量是類的常量成員。

聲明字段成員變量的語法如下:

[訪問修飾符]數(shù)據(jù)類型成員變量名2.屬性成員類的函數(shù)成員包括:屬性、方法、索引器、事件、運(yùn)算符、構(gòu)造函數(shù)和析構(gòu)函數(shù)。下面我們來介紹一下屬性成員。從前面學(xué)習(xí)可知,其他類可以訪問某個(gè)類中具有public權(quán)限的成員變量,將變量聲明為public類型,不利于數(shù)據(jù)的平安,破壞了類的封裝特性。通過屬性成員可以對類中私有成員變量進(jìn)行讀取和賦值操作。屬性成員中用get{}訪問器和set{}訪問器來對類中私有成員變量進(jìn)行讀寫操作的。定義屬性方法格式如下:

[訪問修飾符]數(shù)據(jù)類型屬性名

{

get{}//get訪問器

set{}//set訪問器

}

3.方法方法用來描述對象的行為,對類的數(shù)據(jù)成員的操作都封裝在類的方法中。方法的主要功能便是數(shù)據(jù)操作,沒有方法的程序是沒有意義的,就像如果不具有接打等功能,是沒有什么作用的。

方法的聲明格式如下:

[訪問修飾符]返回值數(shù)據(jù)類型方法名〔參數(shù)列表〕

{

//方法體

}4.靜態(tài)成員類的成員要么是靜態(tài)的,要么是非靜態(tài)的。前面介紹的類的成員都是非靜態(tài)的,使用的必須實(shí)例化。如果將類中的某個(gè)成員聲明為static,那么該成員是靜態(tài)成員,非靜態(tài)成員也叫實(shí)例成員。類的靜態(tài)成員可以直接使用,不必產(chǎn)生類的實(shí)例。無論這個(gè)類創(chuàng)立了多少個(gè)實(shí)例,靜態(tài)成員為類的所有實(shí)例所共享。如任何都可以撥打急救,撥打急救功能可以定義為靜態(tài)的.【范例4-2】定義一個(gè)有多種成員類型的類1privatestring_owner;//定義一個(gè)私有字段表示機(jī)主

2publicstringaddress;//定義一個(gè)公有字段表示地址

3privatestaticstring_phoneNumber;//定義一個(gè)靜態(tài)字段成員用于表示號碼

4//屬性成員

5publicstringOwner//定義一個(gè)屬性成員,用于設(shè)置和獲取私有字段_owner的值

6{

7get{return_owner;}//獲取私有字段_owner的值

8set{_owner=value;}//設(shè)置和私有字段_owner的值value是關(guān)鍵字

9}

10//無參數(shù)方法成員,表示具有撥打功能

11publicvoidDial()

12{

13Console.WriteLine(“您正在撥打!”);

14}

15//有參數(shù)方法成員,表示這種撥打一個(gè)具體的號碼

16publicvoidDial(stringnumber)

17{

18Console.WriteLine(“您正在撥打:”+number);

19}

20//靜態(tài)屬性成員,用于設(shè)置和獲取靜態(tài)字段成員_phoneNumber的值

21publicstaticstringPhoneNumber

22{

23get{return_phoneNumber;}

24set{_phoneNumber=value;}

25}

26//添加靜態(tài)方法EmergencyCall;

27publicstaticvoidEmergencyCall()

28{

29Console.WriteLine(“您正在撥打急救119!”);

30}

在Program.cs的Main方法中輸入以下代碼以測試類的成員。Phone.EmergencyCall();//靜態(tài)方法可直接使用Console.WriteLine(Phone.emergency_Call);PhoneobjPhone=newPhone();//創(chuàng)立對象objPhone.PhoneNumber通過set訪問器私有字段phoneNumber賦值Console.WriteLine("號碼是:"+objPhone.PhoneNumber);//通過get訪問器得到私有字段phoneNumber的值

objPhone.Dial();使用非靜態(tài)成員Console.Read();第4章主流軟件開發(fā)方法

——面向?qū)ο笕腴T類的定義和類的成員

對象的創(chuàng)立和使用

構(gòu)造函數(shù)和析構(gòu)函數(shù)

分部類

結(jié)構(gòu)和類

命名空間4.2C#中的對象類和對象是密不可分的,有類就有對象,有對象就有類??陀^世界是由多種對象組成的,用面向?qū)ο蟮乃枷雭砭帉懗绦?,就要把一切都看為對象?.2.1對象的概念類是相同特征的一類事物的抽象,而對象是類的實(shí)例。類和對象有著本質(zhì)的區(qū)別:類是從對象中抽取出來的一類對象的描述,對象是真實(shí)的個(gè)體,是一個(gè)具體的事物,從抽象到具體即是將類的屬性和行為實(shí)例化的過程。類與對象的關(guān)系可以比喻為車型設(shè)計(jì)和具體的車:類就像車型設(shè)計(jì)一樣說明了車所應(yīng)該具備的所有屬性和功能,但是車型設(shè)計(jì)并不是車,你不能發(fā)動(dòng)和駕駛車型;對象就像根據(jù)車型設(shè)計(jì)制造出的車,它們都具備車型設(shè)計(jì)所描述的屬性和功能,車是能發(fā)動(dòng)和駕駛的。4.2.2對象的創(chuàng)立和使用類是抽象的,要使用類中非靜態(tài)的成員,就必須實(shí)例化類,即創(chuàng)立類的對象。如何創(chuàng)立對象并使用它呢?

使用new運(yùn)算符來創(chuàng)立類的對象!

對象的創(chuàng)立必須以類為根底,聲明一個(gè)對象就是類的實(shí)例化的過程,C#使用new運(yùn)算符來創(chuàng)立對象,格式如下:

類名對象名=new類名(參數(shù)列表);

PhoneobjPhone=newPhone();

對象的使用是通過對對象中的成員的訪問來實(shí)現(xiàn)的,訪問對象中的成員的語法如下:

對象名.成員名

如:

objPhone.address=“辦公樓4.2.3匿名類型和對象初始化器匿名類型和對象初始化器是C#3.0新增加的功能,用來簡化對象的初始值設(shè)置的。使用對象初始化,創(chuàng)立Phone并對其屬性成員Owner賦值可以這樣寫:

PhoneobjPhone=newPhone(){Owner=“辦公樓3204”};

例如:定義類Point,有兩個(gè)自動(dòng)屬性X,Y表示點(diǎn)的坐標(biāo)。1publicclassPoint

2{

3publicintX{get;set;}

4publicintY{get;set;}

5}

使用對象初始化,可這樣創(chuàng)立對象并對屬性賦值:

Pointp=newPoint(){X=0,Y=0};

使用匿名類型可以定義內(nèi)嵌的類型,不需要顯式地定義一個(gè)類型。假設(shè)沒有定義Phone類,卻要使用一個(gè)Phone對象〔即類型是匿名的〕,可以使用對象初始化語法,但不用指定類型名:

varp=new{X=0,Y=2};在VS2008中,仍然可以使用智能感應(yīng)功能得到這個(gè)匿名類型的屬性列表。4.2.4構(gòu)造函數(shù)和析構(gòu)函數(shù)對象和客觀世界中的事物一樣,從創(chuàng)立到消亡都有一個(gè)生命周期,對象的創(chuàng)立和銷毀是通過類的構(gòu)造函數(shù)和析構(gòu)函數(shù)來完成的。

構(gòu)造函數(shù)C#通過new創(chuàng)立對象的過程實(shí)際就是調(diào)用類的構(gòu)造函數(shù)的過程,創(chuàng)立對象時(shí),必須調(diào)用構(gòu)造函數(shù),構(gòu)造函數(shù)是用于執(zhí)行類的實(shí)例的初始化。每個(gè)類都有構(gòu)造函數(shù),如果沒有定義,系統(tǒng)會(huì)提供一個(gè)默認(rèn)的構(gòu)造函數(shù),默認(rèn)的構(gòu)造函數(shù)一般不執(zhí)行什么操作。在訪問一個(gè)類的時(shí)候,系統(tǒng)將最先執(zhí)行構(gòu)造函數(shù)中的語句。

構(gòu)造函數(shù)是類的特殊方法成員,名稱和類名相同,主要用來完成初始化的。

2.析構(gòu)函數(shù)析構(gòu)函數(shù)用于在對象銷毀前釋放被占用的系統(tǒng)資源。析構(gòu)函數(shù)的名字與類名相同,只是在前面加了一個(gè)符號“~”,析構(gòu)函數(shù)不接受任何參數(shù),也不返回任何值,例如:

1publicclassMyClass

2{

3~MyClass()

4{//析構(gòu)函數(shù)}一個(gè)類只能有一個(gè)析構(gòu)函數(shù),析構(gòu)函數(shù)不能手動(dòng)調(diào)用,是系統(tǒng)自動(dòng)調(diào)用的。提示

5}

【范例4-3】定義一個(gè)有多種成員類型的類1classProgram

2{

3staticvoidMain(string[]args)

4{

5}

6}//類program結(jié)束

7

8classScore

9{

10publicintx;//定義字段成員x

11publicinty;//定義字段成員y

12

13publicScore()//無參數(shù)構(gòu)造函數(shù)用于對字段成員初始化

14{

15x=0;y=2;//用于對字段成員初始化

16}

17publicScore(intval_x,intval_y)//有參數(shù)構(gòu)造函數(shù)

18{

19x=val_x;y=val_y;//用于對字段成員初始化

20}

21

22~Score()//析構(gòu)函數(shù)

23{

24Console.WriteLine(“析構(gòu)函數(shù)主要用于清理資源!”);

25Console.ReadKey();//為了看見析構(gòu)函數(shù)的運(yùn)行,可以添加此行代碼;

26}析構(gòu)函數(shù)不能有任何訪問修飾符,也不能有返回值,否那么會(huì)出錯(cuò)。

27}

在Program.cs的Main方法中輸入以下代碼以測試類的成員。1ScoreobjScore1=newScore();//用無參構(gòu)造函數(shù)創(chuàng)立對象objScore1

2Console.WriteLine(“無參數(shù)構(gòu)造函數(shù)演示”);

3Console.WriteLine(“x=”+objScore1.x);

4Console.WriteLine(“y=”+objScore1.y);

5ScoreobjScore2=newScore(80,90);//用有參構(gòu)造函數(shù)創(chuàng)立對象objScore2

6Console.WriteLine(“有參數(shù)構(gòu)造函數(shù)演示”);

7Console.WriteLine(“x=”+objScore2.x);

8Console.WriteLine(“y=”+objScore2.y);

9Console.ReadKey();

4.2.5參數(shù)傳遞C#傳遞參數(shù)有兩種類型:值傳遞和引用傳遞,前面的例子沒有具體說明參數(shù)傳遞的類型,是按照值傳遞來進(jìn)行的,值傳遞是C#默認(rèn)傳遞方式。使用值傳遞方式向方法傳遞參數(shù),向方法傳遞的是參數(shù)的副本,方法內(nèi)發(fā)生的對參數(shù)的更改對該參數(shù)本身無任何影響,就像文件的復(fù)印件一樣,無論如何修改復(fù)印件,原件不會(huì)有任何改變。如果希望所調(diào)用的方法更改參數(shù)的值,必須使用ref或out關(guān)鍵字聲明通過引用方式傳遞參數(shù),out傳遞與ref類似,二者區(qū)別是ref要求參數(shù)變量在傳遞之前必須初始化,out那么不要求。第4章主流軟件開發(fā)方法

——面向?qū)ο笕腴T類的定義和類的成員

對象的創(chuàng)立和使用

構(gòu)造函數(shù)和析構(gòu)函數(shù)

分部類

結(jié)構(gòu)和類

命名空間4.3分部類Partial類,有人翻譯為“局部類”,在MSDN上譯為“分部〔類型〕”,

所以我們使用“分部類”這一官方說法。提示

一般來說,一個(gè)類、結(jié)構(gòu)或接口位于一個(gè)源文件中,但某些情況,比方大型工程、特殊部署時(shí),可能需要把一個(gè)類、結(jié)構(gòu)或接口放在幾個(gè)文件中來處理。等到編譯時(shí),自動(dòng)把它們組合起來成為一個(gè)完整的類,這就得應(yīng)用C#分部類了。

分部類適用于以下情況:(1)類型特別大,不宜放在一個(gè)文件中實(shí)現(xiàn);(2)一個(gè)類型中的一局部代碼為自動(dòng)化工具生成的代碼,不宜與我們自己編寫的代碼混合在一起;(3)需要多人合作編寫一個(gè)類。分部類是一個(gè)純語言層的編譯處理,不影響任何執(zhí)行機(jī)制,事實(shí)上C#編譯器在編譯的時(shí)候仍會(huì)將各個(gè)局部的局部類型合并成一個(gè)完整的類。

C#分部類的關(guān)鍵字修飾符是partial。

例如在一個(gè)文件中聲明分部類Person的代碼如下。01publicpartialclassPerson //定義分部類Person的局部代碼02{03publicvoidDoWork() //定義方法DoWork04{05 //定義方法,表示Person類有工作的功能;06}07}在另一個(gè)文件中聲明分部類Person01publicpartialclassPerson //定義分部類Person的局部代碼02{03publicvoidGoToLunch() //定義方法GoToLunch04{05 //定義方法,表示Person類有去吃午飯的功能06}07}第4章主流軟件開發(fā)方法

——面向?qū)ο笕腴T類的定義和類的成員

對象的創(chuàng)立和使用

分部類

結(jié)構(gòu)和類

命名空間4.4結(jié)構(gòu)與類

4.4.1結(jié)構(gòu)的定義和使用

結(jié)構(gòu)類型是一種值類型,通常用來封裝小型相關(guān)變量組,例如,矩形的坐標(biāo)或商品的特征。結(jié)構(gòu)和類相似,但結(jié)構(gòu)缺乏某些功能,例如繼承。由于結(jié)構(gòu)是值類型,通常創(chuàng)立結(jié)構(gòu)要比創(chuàng)立類的速度快。如果需要一些緊湊循環(huán),需要在其中創(chuàng)立大量新數(shù)據(jù)結(jié)構(gòu),那么應(yīng)考慮使用結(jié)構(gòu)而不是類。在C#中,結(jié)構(gòu)可以看成輕量級的類,定義和類的定義相似,采用struct進(jìn)行定義,每個(gè)struct類型數(shù)據(jù)可以常量、變量、構(gòu)造函數(shù)、方法和屬性等成員。

定義結(jié)構(gòu)的語法如下:

<訪問修飾符>struct結(jié)構(gòu)名

{

//結(jié)構(gòu)體定義

}

使用結(jié)構(gòu)通過聲明結(jié)構(gòu)體變量或使用new來實(shí)例化結(jié)構(gòu)對象,然后通過結(jié)構(gòu)體變量.結(jié)構(gòu)成員名,或結(jié)構(gòu)對象.結(jié)構(gòu)成員的方式來使用結(jié)構(gòu)?!痉独?-5】定義表示學(xué)生信息的結(jié)構(gòu)Student并使用。01structStudent //定義結(jié)構(gòu)Student02{ //結(jié)構(gòu)的成員變量03publicStringstuNum; //定義結(jié)構(gòu)成員表示學(xué)生學(xué)號04publicStringstuName; //定義結(jié)構(gòu)成員表示學(xué)生姓名05publicintstuAge; //定義結(jié)構(gòu)成員表示學(xué)生年齡06publicintstuClass; //定義結(jié)構(gòu)成員表示學(xué)生班級07publicintstuGrade; //定義結(jié)構(gòu)成員表示學(xué)生年級08publicStudent(stringstuNum,stringstuName,intstuAge,intstuClass,intstuGrade)09{ //結(jié)構(gòu)的構(gòu)造函數(shù),用參數(shù)給結(jié)構(gòu)中的成員賦值10this.stuNum=stuNum; //將參數(shù)stuNum賦給this.stuNum11this.stuName=stuName; //將參數(shù)stuName賦給this.stuName12this.stuAge=stuAge; //將參數(shù)stuAge賦給this.stuAge13this.stuClass=stuClass; //將參數(shù)stuClass賦給this.stuClass14this.stuGrade=stuGrade; //將參數(shù)stuGrade賦給this.stuGrade15}16publicvoidDoHomework() //結(jié)構(gòu)中的方法17}18 //結(jié)構(gòu)中的方法19}20}4.4.2類和結(jié)構(gòu)的關(guān)系類和結(jié)構(gòu)實(shí)際上都是創(chuàng)立對象的模板,都可以包含構(gòu)造函數(shù),常數(shù),字段,方法,屬性,索引器和運(yùn)算符等成員。二者的主要區(qū)別如下。

⑴結(jié)構(gòu)是值類型,類是引用類型,在內(nèi)存中結(jié)構(gòu)是存儲(chǔ)在堆棧上的值類型,類是存儲(chǔ)在堆(heap)上的引用類型。

⑵結(jié)構(gòu)的構(gòu)造函數(shù)和類的構(gòu)造函數(shù)不同:.結(jié)構(gòu)不能包含顯式的無參數(shù)構(gòu)造函數(shù),結(jié)構(gòu)成員會(huì)自動(dòng)初始化為它們的默認(rèn)值,.結(jié)構(gòu)不能包含以下形式的初始值設(shè)定類:base〔參數(shù)列表〕。

⑶對于結(jié)構(gòu)中的實(shí)例字段成員,不能在聲明時(shí)賦值初始化。

⑷聲明了結(jié)構(gòu)類型后,可以使用new運(yùn)算符創(chuàng)立構(gòu)造對象,也可以不使用new關(guān)鍵字。如果不使用new,那么在初始化所有字段之前,字段將保持未賦值狀態(tài)且對象不可用。

⑸結(jié)構(gòu)不支持繼承,即一個(gè)結(jié)構(gòu)不能從另一個(gè)結(jié)構(gòu)或類繼承,而且不能作為一個(gè)類的基類。

第4章主流軟件開發(fā)方法

——面向?qū)ο笕腴T類的定義和類的成員

對象的創(chuàng)立和使用

分部類

結(jié)構(gòu)和類

命名空間4.5命名空間C#程序是利用命名空間組織起來的。命名空間既用作程序的“內(nèi)部”組織系統(tǒng),又用作“外部”組織系統(tǒng)〔一種將已向其他程序公開的程序元素進(jìn)行展示的方式〕。就像一個(gè)城市為

溫馨提示

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

評論

0/150

提交評論