《C#程序設(shè)計(jì)及基于工作過程的項(xiàng)目開發(fā)》課件第2章_第1頁(yè)
《C#程序設(shè)計(jì)及基于工作過程的項(xiàng)目開發(fā)》課件第2章_第2頁(yè)
《C#程序設(shè)計(jì)及基于工作過程的項(xiàng)目開發(fā)》課件第2章_第3頁(yè)
《C#程序設(shè)計(jì)及基于工作過程的項(xiàng)目開發(fā)》課件第2章_第4頁(yè)
《C#程序設(shè)計(jì)及基于工作過程的項(xiàng)目開發(fā)》課件第2章_第5頁(yè)
已閱讀5頁(yè),還剩80頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

學(xué)習(xí)情境二面向?qū)ο缶幊?.1任務(wù)一:學(xué)會(huì)使用已有資源2.2任務(wù)二:學(xué)生類的初步設(shè)計(jì)2.3任務(wù)三:學(xué)生類的進(jìn)階設(shè)計(jì)2.4舉一反三

2.1任務(wù)一:學(xué)會(huì)使用已有資源

2.1.1功能描述

本任務(wù)通過一個(gè)控制臺(tái)應(yīng)用程序,演示了C#.NET框架類中的幾個(gè)常用的類,包括System.String、System.StringBuilder、System.Math和System.Random類。2.1.2代碼展示

1usingSystem;

2usingSystem.Text;

3namespaceuseClassPro

4{

5classProgram

6{

7staticvoidMain(string[]args)

8{

9StringBuilderformer=newStringBuilder("原始字符串為:");

10StringBuildertotal;

11stringmutation1,mutation2,mutation3;

12inta,b,c;

13doublediscriminant,root1,root2,test;

14Console.WriteLine("原始字符串為:\""+former+"\"");

15Console.WriteLine("字符串長(zhǎng)度為:"+former.Length);

16total=former.Append("ax^2+bx+c");

17mutation1=total.ToString().ToUpper();

18mutation2=mutation1.Replace("X","y");

19mutation3=mutation2.Substring(21,9);

20Console.WriteLine("連接后的字符串為:"+total);

21Console.WriteLine("mutation1--調(diào)用大寫函數(shù)后:"+mutation1);

22Console.WriteLine("mutation2--調(diào)用替代函數(shù)將X替代為y后:"

+mutation2);

23Console.WriteLine("mutation3--mutation2的子串:"+mutation3);

24Console.WriteLine();

25Console.WriteLine("請(qǐng)輸入x^2的參數(shù)A:");

26a=int.Parse(Console.ReadLine());

27Console.Write("請(qǐng)輸入x的參數(shù)B:");

28b=int.Parse(Console.ReadLine());

29Console.WriteLine("請(qǐng)輸入方程的常數(shù)C:");

30c=int.Parse(Console.ReadLine());

31discriminant=Math.Pow(b,2)-(4*a*c);

32root1=((-1*b)+Math.Sqrt(discriminant))/(2*a);

33root2=((-1*b)-Math.Sqrt(discriminant))/(2*a);

34Console.WriteLine("Root1:"+root1);

35Console.WriteLine("Root2:"+root2);

36Console.WriteLine();

37Console.WriteLine("讓我們嘗試隨機(jī)生成方程:");

38System.Randomgenerator=newRandom(DateTime.Now.Millisecond);

39a=generator.Next(100)-50;

40b=generator.Next(35);

41c=generator.Next();

42Console.WriteLine("隨機(jī)生成的方程是:"

+a+"x^2+"+b+"x+"+c);

43Console.WriteLine();

44test=generator.NextDouble();

45Console.WriteLine("test:0.0~1.0:"+test);

46test=generator.NextDouble()*10;

47Console.WriteLine("test:0.0~10.0:"+test);

48Console.ReadLine();

49}

50}

51}代碼分析:

2 該例中使用了StringBuilder類,由于該類在名稱空間System.text中,因此using語(yǔ)句導(dǎo)入該名稱空間。

9 新建StringBuilder類的實(shí)例對(duì)象former,初始值為“原始字符串為:”。

10 定義StringBuilder類的對(duì)象total,未對(duì)其進(jìn)行初始化。

11 定義string類型變量3個(gè):mutation1、mutation2和mutation3,用于進(jìn)行字符串?dāng)?shù)據(jù)的處理。

12 定義int類型變量3個(gè):a、b、c,用于進(jìn)行整數(shù)數(shù)據(jù)的處理。

13 定義double類型變量3個(gè):root1、root2、test,用于進(jìn)行小數(shù)數(shù)據(jù)的處理。

14~15 輸出StringBuilder的實(shí)例對(duì)象former的內(nèi)容和長(zhǎng)度。

16 在StringBuilder的實(shí)例former的末尾連接上字符串“ax^2+bx+c”,將連接后的字符串賦值到StringBuilder的實(shí)例對(duì)象total中。

17 將StringBuilder的實(shí)例total通過ToString()方法轉(zhuǎn)換為字符串,并通過ToUpper()方法轉(zhuǎn)換為大寫,并賦值到字符串變量mutation1中。

18 將字符串變量mutation1中的X替換為y,并將替換后的結(jié)果賦值到字符串變量mutation2中。

19 取字符串變量mutation2中從第22個(gè)字符開始的9個(gè)字符,作為子串賦值到字符串變量mutation3中。

注意:字符串的索引是從0開始的,所以第1個(gè)字符的索引是0,第22個(gè)字符的索引是21。

20~24 將處理后的數(shù)值輸出。

25~30 在用戶屏幕上輸入3個(gè)整數(shù),每個(gè)數(shù)以一個(gè)回車結(jié)束。這3個(gè)數(shù)值被賦值到a、b、c3個(gè)變量中。

注意:ReadLine()函數(shù)接收以回車結(jié)束的一行數(shù)據(jù)。

31~33 用來求方程的根。

31 求判別式“b^2-4ac”的值,這里用到數(shù)學(xué)函數(shù)Math.Pow(b,2),表示b的平方。Pow函數(shù)用來求數(shù)的n次方。

32~33 用公式求方程的兩個(gè)根。數(shù)學(xué)函數(shù)Math.Sqrt()用來求函數(shù)所帶參數(shù)的平方根。

38 生成隨機(jī)類的實(shí)例對(duì)象generator,使用當(dāng)前系統(tǒng)時(shí)間DateTime.Now.Millisecond作為種子值,這樣可以增加隨機(jī)性。

39 生成一個(gè)-50~49之間的隨機(jī)數(shù),賦值給a。

40 生成一個(gè)0~34之間的隨機(jī)數(shù),賦值給b。

41 生成一個(gè)整數(shù)int范圍內(nèi)的隨機(jī)數(shù),賦值給c。

42 輸出生成的隨機(jī)方程。

44~47 生成隨機(jī)小數(shù),調(diào)整范圍并輸出。2.1.3知識(shí)點(diǎn)1——.NET框架類之Math類

C#標(biāo)準(zhǔn)類庫(kù)的System命名空間中定義了大量的常用類。其中Math類中提供了大量的基本數(shù)學(xué)函數(shù),用來幫助我們執(zhí)行數(shù)學(xué)計(jì)算。該類主要為三角函數(shù)、對(duì)數(shù)函數(shù)和其它通用數(shù)學(xué)函數(shù)提供常數(shù)和靜態(tài)方法。表2.1列出了Math類的一些方法和說明,由于數(shù)量較多、用法較簡(jiǎn)單,這里不一一詳解。要查找如何使用每個(gè)方法的其它信息,可以搜索幫助文件的“MathMember”。

Math類中的所有方法都是靜態(tài)方法(staticmethods),也稱為類方法(classmethods)。靜態(tài)方法可以通過定義它們的類名來觸發(fā),不需要首先實(shí)例化一個(gè)類的對(duì)象。

Math類的方法用于進(jìn)行數(shù)學(xué)運(yùn)算,它們的返回值就是運(yùn)算結(jié)果,可以根據(jù)需要用于表達(dá)式。例如,下面語(yǔ)句計(jì)算變量price的絕對(duì)值,將它加上變量aigo的值的3次方,然后將結(jié)果存儲(chǔ)到變量total中:

total=Math.abs(price)+Math.pow(aigo,3);2.1.4知識(shí)點(diǎn)2——.NET框架類之Random類

我們?cè)诰帉憣?shí)際應(yīng)用軟件的時(shí)候,經(jīng)常需要用到隨機(jī)數(shù)。如游戲中經(jīng)常要用隨機(jī)數(shù)來表示擲骰子和撲克發(fā)牌,網(wǎng)絡(luò)考試系統(tǒng)中用隨機(jī)數(shù)來從題庫(kù)中抽取考題,飛行模擬也可以使用隨機(jī)數(shù)來模擬飛機(jī)引擎發(fā)生故障的幾率等。

Random類是System命名空間的一部分,表示偽隨機(jī)數(shù)生成器(pseudorandomnumbergenerator)。它是一種能夠產(chǎn)生滿足某些隨機(jī)性統(tǒng)計(jì)要求的數(shù)字序列的設(shè)備。隨機(jī)數(shù)生成器從一個(gè)程序員指定的范圍內(nèi)提取一個(gè)值。由于這是用一種確定的數(shù)學(xué)算法選擇的,是以相同的概率從一組有限的數(shù)字中選取的,因此所選數(shù)字并不具有完全的隨機(jī)性。但是從實(shí)用的角度而言,其隨機(jī)程度已足夠了。表2.2中列出了Random類的一些常用方法。其中,Next方法用來產(chǎn)生隨機(jī)整數(shù)。它可以不帶參數(shù),這樣表示產(chǎn)生一個(gè)整個(gè)int范圍內(nèi)的隨機(jī)值,包括負(fù)數(shù)。但是,實(shí)際問題中通常需要更具體的范圍,可以使用帶參數(shù)的Next方法返回一個(gè)從0到比給定參數(shù)(maxValue)小1的范圍內(nèi)的整數(shù)值。例如模擬篩子時(shí),需要一個(gè)1~6之間的隨機(jī)整數(shù)值。就可以調(diào)用Next(6)來得到一個(gè)0~5之間的隨機(jī)數(shù),然后加上1,即Next(6)+1。可以看出,傳遞給Next方法的值也就是可能得到的隨機(jī)數(shù)的數(shù)量。可以根據(jù)實(shí)際情況增加或減去適當(dāng)?shù)臄?shù)量來改變隨機(jī)數(shù)范圍。

同樣的道理,NextDouble方法返回的是0.0~1.0之間的浮點(diǎn)數(shù)。如果需要,可以通過乘法來調(diào)節(jié)結(jié)果。2.1.5知識(shí)點(diǎn)3——.NET框架類之String類

在學(xué)習(xí)情境一中,我們已經(jīng)知道了C#支持的基本數(shù)據(jù)類型。其中,有用來存放單個(gè)字符的char類型,它們用單引號(hào)表示。那么,由多個(gè)字符組成、用雙引號(hào)表示的字符串該如何表示呢?在C#?中,string作為一種內(nèi)在的或者原始的數(shù)據(jù)類型來使用。它可以用簡(jiǎn)單的變量初始化來創(chuàng)建。

實(shí)際上,在C#?中也包含了一個(gè)類名稱為String,它是string關(guān)鍵字的一個(gè)別名,二者可以互換使用。在我們的實(shí)例代碼中使用關(guān)鍵字string,但是如果在聯(lián)機(jī)幫助文檔中查找string,則指向的是String類。這并不矛盾,因?yàn)樵趦?nèi)部,C#將所有原始類型均表示為類。讓我們來看看String數(shù)據(jù)類型的基本操作:

strings1="orange";

strings2="red";

s1+=s2;

System.Console.WriteLine(s1);

//輸出"orangered"

s1=s1.Substring(2,5);

System.Console.WriteLine(s1);

//輸出"anger"

s1=s1.ToUpper();

System.Console.WriteLine(s1);

//輸出"ANGER"在C#?中,字符串對(duì)象是“不可變的”,任何對(duì)String的修改都會(huì)創(chuàng)建一個(gè)新String對(duì)象。在前面的示例中,語(yǔ)句“s1+=s2;”將s1和s2的內(nèi)容連接起來以構(gòu)成一個(gè)字符串,+=運(yùn)算符會(huì)創(chuàng)建一個(gè)包含內(nèi)容為“orangered”的新字符串,由s1引用。包含"orange"和"red"的兩個(gè)字符串均保持不變。而原來由s1引用的包含"orange"的字符串仍然存在,但將不再被引用。同理,“s1=s1.Substring(2,5);”、“s1=s1.ToUpper();”也分別創(chuàng)建了新字符串給s1引用。大量的類似字符串相加操作的時(shí)候,就會(huì)有很多字符串像s1一樣不再被引用,從而造成內(nèi)存資源的極大浪費(fèi)。當(dāng)我們需要對(duì)字符串執(zhí)行重復(fù)修改的情況下,例如在一個(gè)循環(huán)中將許多字符串連接在一起時(shí),使用String類,系統(tǒng)開銷可能會(huì)非常大。如果要修改字符串而不創(chuàng)建新的對(duì)象,則C#中還有另外一種創(chuàng)建和使用字符串的格式,即System.Text.StringBuilder類。解決這種問題時(shí)使用StringBuilder類可以提升性能。

StringBuilder類必須使用new運(yùn)算符來創(chuàng)建對(duì)象。以下語(yǔ)句聲明了一個(gè)StringBuilder類的對(duì)象MyStringBuilder,并將其初始化為"HelloWorld!":

StringBuilderMyStringBuilder=newStringBuilder("HelloWorld!");

StringBuilder類支持很多和String類中一樣的屬性和方法,并且在很多情況下,它們?cè)诖a中的用法是類似的。

表2.4中列出了StringBuilder類的一些構(gòu)造函數(shù)和常用成員。

String和StringBuilder兩種類型之間的轉(zhuǎn)換方法如下:

要從一個(gè)String對(duì)象中得到一個(gè)StringBuilder對(duì)象,可使用StringBuilder類的構(gòu)造函數(shù)publicStringBuilder(String);要從StringBuilder對(duì)象中得到String對(duì)象,可使用ToString方法。演示如下:

StringBuildermyStringBuilder=newStringBuilder(myString);

??StringmyString=myStringBuilder.ToString();

關(guān)于new運(yùn)算符和構(gòu)造函數(shù)等概念,將在下一個(gè)任務(wù)中詳細(xì)介紹。 2.2任務(wù)二:學(xué)生類的初步設(shè)計(jì)

2.2.1功能描述

創(chuàng)建類及對(duì)象:本任務(wù)設(shè)計(jì)一個(gè)學(xué)生基本信息的實(shí)體類,并在Windows應(yīng)用程序的窗體中調(diào)用該類。本任務(wù)在窗體類中創(chuàng)建并修改學(xué)生類實(shí)例對(duì)象的屬性,通過學(xué)生類實(shí)例調(diào)用類中公共方法,最后將調(diào)用的結(jié)果顯示在窗體的label控件上。運(yùn)行結(jié)果如圖2.1所示。圖2.1在已有項(xiàng)目中增加一個(gè)新類有兩種方法。

(1)選擇“項(xiàng)目→添加類”菜單項(xiàng)。選中后,VisualStudio將顯示“添加新項(xiàng)”對(duì)話框,并在模板中已選中“類”。

(2)右擊解決方案,選擇“添加→添加類”。和第(1)種方法一樣,VisualStudio將顯示“添加新項(xiàng)”對(duì)話框。

輸入類名Student后點(diǎn)擊確定,VisualStudio為我們?cè)黾右粋€(gè)新類并顯示默認(rèn)的代碼。在該代碼框架中添加所需代碼后,學(xué)生信息實(shí)體類的基本設(shè)計(jì)就完成了。2.2.2代碼展示

1usingSystem;

2/*********************************

3*類名:Student

4*創(chuàng)建日期:2009-03-29

5*功能描述:學(xué)生信息實(shí)體類

6*******************************/

7namespaceWindowsApplication2

8{

9[Serializable]

10publicclassStudent

11{

12#regionPrivateMembers

13protectedintid;

14protectedintclassID;

15protectedstringstudentNO=String.Empty;

16protectedstringstudentname=String.Empty;

17protectedstringsex=String.Empty;

18protectedstringaddress=String.Empty;

19protecteddoublepostalCode;

20#endregion

21#regionPublicProperties

22publicintId

23{

24get{returnid;}

25}

26publicintClassID

27{

28get{returnclassID;}

29set{classID=value;}

30}

31publicstringStudentNO

32{

33get{returnstudentNO;}

34set{studentNO=value;}

35}

36publicstringStudentName

37{

38get{returnstudentname;}

39set{studentname=value;}

40}

41publicstringSex

42{

43get{returnsex;}

44set{sex=value;}

45}

46publicstringAddress

47{

48get{returnaddress;}

49set{address=value;}

50}

51publicdoublePostalCode

52{

53get{returnpostalCode;}

54set{postalCode=value;}

55}

56#endregion

57publicboolistownee(strings1,strings2)

58{

59return(s1==s2);

60}

61publicvoideditStu(stringsNo,stringsAdd,doublesPC)

62{

63this.StudentNO=sNo;

64this.address=sAdd;

65this.postalCode=sPC;

66}

67}

68}代碼分析:

12~20 定義了學(xué)生信息類的私有成員。

21~56 定義了該類的公有屬性,并設(shè)置其訪問器??衫迷L問器來訪問類的私有成員。其中,Id是只讀屬性,因?yàn)樗挥術(shù)et訪問器。

57~60 這是一個(gè)公有布爾類型的方法,含有兩個(gè)字符串類型的參數(shù)。利用return語(yǔ)句返回(s1==s2)的值。若兩個(gè)字符串相等,則返回true,否則返回false。該例中用來判斷兩個(gè)學(xué)生是否同鄉(xiāng)。

61~66 這是一個(gè)公有無(wú)返回值(void)的函數(shù),有3個(gè)參數(shù)。該函數(shù)用來編輯學(xué)生的學(xué)號(hào)、地址和郵編。由關(guān)鍵字void修飾的函數(shù)無(wú)需return語(yǔ)句。本任務(wù)在窗體類Form1的載入事件中調(diào)用該學(xué)生類,代碼如下:

1privatevoidForm1_Load(objectsender,EventArgse)

2{

3Studentstu1=newStudent();

4Studentstu2=newStudent();

5stu1.Address="福建漳州";

6stu2.Address="福建廈門";

7label1.Text="學(xué)生一:"+stu1.Address+"\n";

8label1.Text+="學(xué)生二:"+stu2.Address+"\n";

9label1.Text+="兩個(gè)學(xué)生是同鄉(xiāng):";

10label1.Text+=stu1.istownee(stu1.Address,stu2.Address).ToString();

11label1.Text+="\n";

12stu2.editStu("081023","福建漳州",363000);

13label1.Text+=stu2.StudentNO+stu2.Address+stu2.PostalCode;

14}代碼分析:

3~4創(chuàng)建Student類的兩個(gè)實(shí)例stu1和stu2。

5~6將兩個(gè)實(shí)例的Address屬性分別設(shè)置為"福建漳州"和"福建廈門"。

7~13 將設(shè)置好的地址屬性添加到文本標(biāo)簽label中。詳解見下。

10 調(diào)用istownee函數(shù)返回一個(gè)布爾值,并將其轉(zhuǎn)換為字符串類型顯示。

12 調(diào)用editStu函數(shù)將stu2的學(xué)號(hào)、地址和郵編屬性修改為給定的值:"081023","福建漳州"和363000。

13 將修改后的學(xué)號(hào)、地址和郵編屬性添加到label1中顯示出來。2.2.3知識(shí)點(diǎn)1——方法的解析

1.類和對(duì)象

在深入學(xué)習(xí)類之前,作為初學(xué)者,讓我們先分清類和對(duì)象的概念。類是一個(gè)抽象的概念,對(duì)象則是類的具體實(shí)例。

比如學(xué)生是一個(gè)類,張三、李四、王五都是對(duì)象;首都是一個(gè)類,北京、華盛頓、莫斯科都是對(duì)象;動(dòng)畫貓是一個(gè)類,Kitty、Garfield和Doraemon都是對(duì)象。類是抽象的概念,對(duì)象是真實(shí)的個(gè)體。我們可以說張三(對(duì)象)的體重是55kg,而不能說學(xué)生(類)的體重是55?kg;可以說北京2008年舉辦了奧運(yùn)會(huì),而不能說首都在2008年舉辦了奧運(yùn)會(huì)。一般情況下我們認(rèn)為狀態(tài)是描述具體對(duì)象而不是描述類的,行為是由具體對(duì)象發(fā)出的,而不是由類發(fā)出的。

現(xiàn)實(shí)生活中到處都是對(duì)象,一個(gè)學(xué)生、一輛汽車,一頭大象,乃至一種語(yǔ)言、一種方法,都可以稱為對(duì)象。

2.學(xué)生類的組成部分

我們看到,學(xué)生類由學(xué)生的數(shù)據(jù)聲明和方法聲明組成。數(shù)據(jù)聲明表現(xiàn)為變量;方法則表現(xiàn)為給定名稱的、具有特定功能的一組代碼。在C#中,方法都是某個(gè)類的一部分。

當(dāng)程序調(diào)用一個(gè)方法時(shí),C#將控制流程傳遞給這個(gè)方法,按照流程一行一行地執(zhí)行方法中的語(yǔ)句。方法執(zhí)行完成后,控制流程返回程序調(diào)用方法的地方,繼續(xù)原來的執(zhí)行。

被觸發(fā)的方法也稱為被調(diào)方法(calledmethod),觸發(fā)它的方法稱為主調(diào)方法(callingmethod)。如果它們?cè)谕粋€(gè)類中,則調(diào)用只需要使用方法名;如果它們不在同一個(gè)類中,則要通過其它類的對(duì)象名來觸發(fā)(靜態(tài)方法可以通過類名或者對(duì)象名來訪問)。

圖2.2顯示了方法調(diào)用時(shí)的執(zhí)行流程。圖2.2

3.?return語(yǔ)句

return語(yǔ)句用在方法中。程序執(zhí)行到return語(yǔ)句直接返回方法調(diào)用語(yǔ)句。

Return語(yǔ)句有兩種方式:無(wú)表達(dá)式的return語(yǔ)句只能用在無(wú)返回值的成員中;帶表達(dá)式的return語(yǔ)句只能用在有返回值的函數(shù)成員中。

(1)如果是void方法,則可以使用無(wú)表達(dá)式的return語(yǔ)句,也可以省略。無(wú)表達(dá)式的return語(yǔ)句即:return;程序執(zhí)行到return立即返回調(diào)用語(yǔ)句。如果省略return語(yǔ)句,則程序執(zhí)行到方法的末尾才返回。

(2)對(duì)于有返回值的方法,return語(yǔ)句后面可以是常量表達(dá)式,也可以是變量表達(dá)式,且必須和方法的返回類型是一致的,或者是可以直接隱式轉(zhuǎn)換的。

4.實(shí)例方法和靜態(tài)方法

在這里,我們主要學(xué)習(xí)實(shí)例方法和靜態(tài)方法。實(shí)例方法是較常見的方法,比如上個(gè)任務(wù)中,Random類和StringBuilder類中的絕大部分方法就都是實(shí)例方法。實(shí)例方法必須先實(shí)例化對(duì)象,再用對(duì)象調(diào)用方法。靜態(tài)方法我們也提到過,那就是Math類中的所有方法。靜態(tài)方法使用類名調(diào)用。實(shí)例方法的語(yǔ)法格式如下:

訪問修飾符返回類型方法名(參數(shù)列表)

{

//方法的主體…

//由return語(yǔ)句返回

}

示例:實(shí)現(xiàn)兩個(gè)整型的加法。

classAdd

{

publicintSum(intpara1,intpara2)

{

returnpara1+para2;

}

}使用實(shí)例方法:

AddmyAdd=newAdd(); //實(shí)例化一個(gè)對(duì)象

intsum=myAdd.Sum(2,3); //調(diào)用方法

使用static修飾的方法稱為靜態(tài)方法:

classmySwap

{

publicstaticvoidSwap(intnum1,intnum2)

{

inttemp;

temp=num1;num1=num2;

num2=temp;

}

}

靜態(tài)方法使用類名調(diào)用:

classProgram

{

staticvoidMain(string[]args)

{

intnum1=5,num2=10;

mySwap.Swap(num1,num2);

}

}

5.方法的重載

讓我們回想一下剛剛看過的程序片段:

publicintSum(intpara1,intpara2)

{

returnpara1+para2;

}

該方法實(shí)現(xiàn)兩個(gè)整數(shù)的相加。那如果我們想讓兩個(gè)string型或兩個(gè)double型相加,該怎么做?如果我們?yōu)閟tring、double再各自寫一個(gè)方法,那么我們?cè)谡{(diào)用之前就要先清楚參數(shù)的類型。能不能不管參數(shù)是什么類型,都不影響函數(shù)的調(diào)用呢?這就要用到方法的重載。在同一個(gè)類中添加幾個(gè)名字相同、參數(shù)與返回值不同的方法,比如:

publicstringSum(stringpara1,stringpara2)

{

returnpara1+para2;

}

publicdoubleSum(doublepara1)

{

returnpara1+para1;

}2.2.4知識(shí)點(diǎn)2——域和屬性

為了保存類的實(shí)例的各種數(shù)據(jù)信息,C#提供了兩種方法:域和屬性。域(字段)和屬性都可以從界面中添加。

1.添加域

打開類視圖,右擊要添加域的類,在彈出的菜單中選擇“添加→添加字段”命令。選擇后,VisualStudio彈出“添加字段”對(duì)話框。在對(duì)話框中可設(shè)置字段的訪問、字段類型、字段名和字段修飾符等信息,還可以設(shè)置字段的注釋說明文字。設(shè)置完成后,單擊“完成”,類的代碼中將被VisualStudio添加字段的聲明語(yǔ)句。如:

protectedintclassID;其中,字段的訪問修飾符可以是以下幾種:

●?new

●?public

●?protected

●?internal

●?private

●?static

●?readonly靜態(tài)域的聲明使用static修飾符,只讀使用readonly修飾符,其它都是非靜態(tài)域。聲明成只讀的字段和聲明成const的效果是一樣的。聲明成只讀字段的示例如下:

publicstaticreadonlydoublePI=3.14159;

const和readonly的區(qū)別在于:const型表達(dá)式的值在編譯時(shí)形成,而staticreadonly表達(dá)式的值直到程序運(yùn)行時(shí)才形成。

2.域(字段)的初始化

VisualStudio為每個(gè)未經(jīng)初始化的變量自動(dòng)初始化為本身的默認(rèn)值。對(duì)于所有引用類型的變量,默認(rèn)值為null。所有變量類型的默認(rèn)值見表2.6。

3.添加屬性

在類視圖中,右擊要添加域的類,選擇“添加”→“添加屬性”命令,則彈出添加屬性對(duì)話框。

和字段一樣,新增屬性也可以設(shè)置很多信息。其中,訪問器一欄表示該屬性在被外部訪問時(shí),是只能讀取(獲取)、只能寫入(設(shè)置)還是可讀取加寫入。以下是VisualStudio自動(dòng)生成的代碼:

publicintClassID

{

get{}

set{}

}屬性的修飾符有以下幾種:

●?new

●?public

●?protected

●?internal

●?private

●?static

●?virtual

●?sealed

●?override

●?abstract

其中,static、virtual、override和abstract這幾個(gè)修飾符不能同時(shí)使用。事實(shí)上,C#中屬性的概念是作為一個(gè)接口存在的,屬性真正的值是存放在私有字段中的。接口的意思就如同我們看電視時(shí)用遙控器換頻道,遙控器就是一個(gè)接口。也許變換頻道也可以通過打開電視機(jī)后蓋,直接操作里面的電路來實(shí)現(xiàn),但我們通過遙控器來操作會(huì)更加安全方便,因?yàn)檫b控器控制了電視器件的可訪問性,保護(hù)了內(nèi)部數(shù)據(jù)的安全。

在意義上表達(dá)屬性完整的代碼其實(shí)比上面自動(dòng)生成的代碼多了一行,就是下面的第1行,那才是真正存放數(shù)據(jù)的私有字段。

privateintage;//年齡

publicintAge

{

get{returnage;}

set

{

if(value>0&&value<150)//判斷用戶企圖設(shè)置的數(shù)值是否合理。

{

age=value;

}

else

{

age=0;

}

}

}設(shè)置器中通過一個(gè)判斷語(yǔ)句來考察用戶設(shè)置的數(shù)值是否合理,以保護(hù)內(nèi)部數(shù)據(jù)的安全,防止被不合理地修改。所以我們建議類內(nèi)部敏感字段使用屬性來控制訪問。

在屬性的訪問聲明中:

①只有set訪問器表明屬性的值只能進(jìn)行設(shè)置而不能讀出;

②只有g(shù)et訪問器表明屬性的值是只讀的,不能改寫;

③同時(shí)具有set訪問器和get訪問器表明屬性的值的讀/寫都是允許的。

添加方法和索引器的向?qū)?duì)話框一目了然,這里就不一一列舉了。2.2.5知識(shí)點(diǎn)3——調(diào)試:查看對(duì)象變量的內(nèi)容

在學(xué)習(xí)情景一中,我們已經(jīng)學(xué)習(xí)了設(shè)置斷點(diǎn)和查看變量的內(nèi)容?,F(xiàn)在讓我們來看看如何查看對(duì)象的內(nèi)容。同樣,先在代碼中設(shè)置斷點(diǎn),如圖2.3所示。圖2.3圖2.4 2.3任務(wù)三:學(xué)生類的進(jìn)階設(shè)計(jì)

2.3.1功能描述

本任務(wù)是在任務(wù)二的基礎(chǔ)上再作進(jìn)一步的設(shè)計(jì),主要示范重構(gòu)的構(gòu)造函數(shù)。其它知識(shí)點(diǎn)“封裝”已經(jīng)在上個(gè)任務(wù)的代碼中體現(xiàn)出來,“繼承”在知識(shí)點(diǎn)中有詳細(xì)例程,請(qǐng)讀者根據(jù)例程自行練習(xí)。重構(gòu)的構(gòu)造函數(shù)演示效果如圖2.5所示。圖2.52.3.2代碼展示

學(xué)生類中的代碼框架和上個(gè)任務(wù)相同,這里不再占用篇幅,只給出構(gòu)造函數(shù)。

publicStudent()

{}

publicStudent(inti,strings1,strings2,strings3)

{

this.classID=i;

this.studentNO=s1;

this.studentname=s2;

this.sex=s3;

}這兩個(gè)名字相同的函數(shù)是構(gòu)造函數(shù)。第一個(gè)為成員變量分配內(nèi)存空間,給出默認(rèn)初值;第二個(gè)為新建的學(xué)生實(shí)例初始化基本信息:班級(jí)號(hào)、學(xué)號(hào)、姓名和性別。編譯器會(huì)自動(dòng)根據(jù)參數(shù)來選擇不同的構(gòu)造函數(shù)。下面是使用不同構(gòu)造函數(shù)實(shí)例化對(duì)象并顯示在label控件上的代碼:

label1.Text+="\n學(xué)生三:";

Studentstu3=newStudent();

Studentstu4=newStudent(1002,"080137","祝英臺(tái)","女");

label1.Text+=stu3.ClassID+stu3.StudentName+stu3.StudentNO+stu3.Sex;

label1.Text+="\n學(xué)生四:";

label1.Text+=stu4.ClassID+stu4.StudentName+stu4.StudentNO+stu4.Sex;2.3.3知識(shí)點(diǎn)1——構(gòu)造函數(shù)和析構(gòu)函數(shù)

1.構(gòu)造函數(shù)

VisualStudio在新建類時(shí)為我們創(chuàng)建的代碼中,有一個(gè)方法的名字和類名是一樣的,這個(gè)特殊的方法稱為構(gòu)造方法(函數(shù))。構(gòu)造函數(shù)是對(duì)象實(shí)例化時(shí)觸發(fā)的方法。如果我們沒有為對(duì)象提供構(gòu)造函數(shù),則默認(rèn)情況下C#將創(chuàng)建一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)實(shí)例化對(duì)象,并將所有成員變量設(shè)置為默認(rèn)值。不帶參數(shù)的構(gòu)造函數(shù)稱為“默認(rèn)構(gòu)造函數(shù)”。無(wú)論何時(shí),只要使用new運(yùn)算符實(shí)例化對(duì)象,并且不為new提供任何參數(shù),就會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù),如:

Studentscofield=newStudent();實(shí)際上,我們經(jīng)常使用構(gòu)造函數(shù)來初始化那些和每個(gè)對(duì)象均相關(guān)的成員變量,如:

publicStudent()

{

publicStudent(stringname,intage,stringhobby)

{

=name;

this.age=age;

this.hobby=hobby;

}

}

Studentwu=newStudent("吳雙",20,"運(yùn)動(dòng)");由此看出,構(gòu)造函數(shù)也是可以重載的。

構(gòu)造函數(shù)在兩個(gè)方面不同于常規(guī)方法:

(1)構(gòu)造函數(shù)與類同名。

(2)構(gòu)造函數(shù)沒有返回值類型。這與返回值類型為void的函數(shù)不同。程序員常犯的一個(gè)錯(cuò)誤就是在構(gòu)造函數(shù)的前面加上void返回類型。在構(gòu)造函數(shù)前放任何返回類型,包括void,都將被編譯器理解為一個(gè)(碰巧)和類的名稱相同的常規(guī)方法。這樣,它就不能作為構(gòu)造函數(shù)來觸發(fā),這有時(shí)會(huì)導(dǎo)致難以解釋的錯(cuò)誤信息。

2.析構(gòu)函數(shù)

析構(gòu)函數(shù)用于析構(gòu)類的實(shí)例。程序員無(wú)法控制何時(shí)調(diào)用析構(gòu)函數(shù),因?yàn)檫@是由垃圾回收器決定的。垃圾回收器檢查是否存在應(yīng)用程序不再使用的對(duì)象。如果垃圾回收器認(rèn)為某個(gè)對(duì)象符合析構(gòu),則調(diào)用析構(gòu)函數(shù)(如果有)并回收用來存儲(chǔ)此對(duì)象的內(nèi)存。程序退出時(shí)也會(huì)調(diào)用析構(gòu)函數(shù)。關(guān)于析構(gòu)函數(shù),有以下幾點(diǎn)注意事項(xiàng):

(1)一個(gè)類只能有一個(gè)析構(gòu)函數(shù)。

(2)無(wú)法繼承或重載析構(gòu)函數(shù)。

(3)無(wú)法調(diào)用析構(gòu)函數(shù)。它們是被自動(dòng)調(diào)用的。

(4)析構(gòu)函數(shù)既沒有修飾符,也沒有參數(shù)。2.3.4知識(shí)點(diǎn)2——封裝(Encapsulation)

制造汽車的過程中什么人最牛?當(dāng)然不是焊鋼板的,也不是裝輪胎的,更不是擰螺絲的,而是設(shè)計(jì)汽車的工程師,因?yàn)樗榔嚨倪\(yùn)行原理。但是我們開車時(shí),需要知道汽車的運(yùn)行原理嗎?顯然不需要。汽車的運(yùn)行原理已經(jīng)被工程師封裝在汽車內(nèi)部,提供給司機(jī)的只是一個(gè)簡(jiǎn)單的使用接口,司機(jī)操縱方向盤和各種按鈕就可以靈活自如地開動(dòng)汽車了。與制造汽車相似,面向?qū)ο蠹夹g(shù)把事物的狀態(tài)和行為的實(shí)現(xiàn)細(xì)節(jié)封裝在類中,形成一個(gè)可以重復(fù)使用的“零件”。類一旦被設(shè)計(jì)好,就可以像工業(yè)零件一樣,被成千上萬(wàn)的對(duì)其內(nèi)部原理毫不知情的程序員使用。類的設(shè)計(jì)者相當(dāng)于汽車工程師,類的使用者相當(dāng)于司機(jī)。這樣程序員就可以充分利用他人已經(jīng)編寫好的“零件”,而將主要精力集中在自己的專注領(lǐng)域。

在C#中,我們使用修飾符來完成對(duì)象的封裝。修飾符是C#的保留字,用于指定一種編程語(yǔ)言構(gòu)造的特定特征。C#可以用不同方式使用一些修飾符,一些修飾符可以同時(shí)使用,而另一些組合是無(wú)效的。可見性修飾符控制了對(duì)類成員的訪問。如果一個(gè)成員有公有可見性(public),則它可以直接從對(duì)象外部引用;如果一個(gè)成員有私有可見性(private),則它可以在類定義的內(nèi)部任何地方使用,但不能在外部引用。還有另外兩種可見性修飾符是protected和friend,它們只在繼承的環(huán)境下使用,我們將在下一個(gè)知識(shí)點(diǎn)中對(duì)其進(jìn)行討論。2.3.5知識(shí)點(diǎn)3——繼承

類可以從其它類中繼承。這是通過以下方式實(shí)現(xiàn)的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論