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

下載本文檔

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

文檔簡介

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

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

2.1.1功能描述

本任務(wù)通過一個控制臺應(yīng)用程序,演示了C#.NET框架類中的幾個常用的類,包括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("字符串長度為:"+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("請輸入x^2的參數(shù)A:");

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

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

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

29Console.WriteLine("請輸入方程的常數(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("讓我們嘗試隨機生成方程:");

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

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

40b=generator.Next(35);

41c=generator.Next();

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

+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語句導(dǎo)入該名稱空間。

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

10 定義StringBuilder類的對象total,未對其進行初始化。

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

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

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

14~15 輸出StringBuilder的實例對象former的內(nèi)容和長度。

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

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

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

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

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

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

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

注意: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 用公式求方程的兩個根。數(shù)學(xué)函數(shù)Math.Sqrt()用來求函數(shù)所帶參數(shù)的平方根。

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

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

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

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

42 輸出生成的隨機方程。

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

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

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

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

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

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

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

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

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

實際上,在C#?中也包含了一個類名稱為String,它是string關(guān)鍵字的一個別名,二者可以互換使用。在我們的實例代碼中使用關(guān)鍵字string,但是如果在聯(lián)機幫助文檔中查找string,則指向的是String類。這并不矛盾,因為在內(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#?中,字符串對象是“不可變的”,任何對String的修改都會創(chuàng)建一個新String對象。在前面的示例中,語句“s1+=s2;”將s1和s2的內(nèi)容連接起來以構(gòu)成一個字符串,+=運算符會創(chuàng)建一個包含內(nèi)容為“orangered”的新字符串,由s1引用。包含"orange"和"red"的兩個字符串均保持不變。而原來由s1引用的包含"orange"的字符串仍然存在,但將不再被引用。同理,“s1=s1.Substring(2,5);”、“s1=s1.ToUpper();”也分別創(chuàng)建了新字符串給s1引用。大量的類似字符串相加操作的時候,就會有很多字符串像s1一樣不再被引用,從而造成內(nèi)存資源的極大浪費。當(dāng)我們需要對字符串執(zhí)行重復(fù)修改的情況下,例如在一個循環(huán)中將許多字符串連接在一起時,使用String類,系統(tǒng)開銷可能會非常大。如果要修改字符串而不創(chuàng)建新的對象,則C#中還有另外一種創(chuàng)建和使用字符串的格式,即System.Text.StringBuilder類。解決這種問題時使用StringBuilder類可以提升性能。

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

StringBuilderMyStringBuilder=newStringBuilder("HelloWorld!");

StringBuilder類支持很多和String類中一樣的屬性和方法,并且在很多情況下,它們在代碼中的用法是類似的。

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

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

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

StringBuildermyStringBuilder=newStringBuilder(myString);

??StringmyString=myStringBuilder.ToString();

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

2.2.1功能描述

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

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

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

輸入類名Student后點擊確定,VisualStudio為我們增加一個新類并顯示默認的代碼。在該代碼框架中添加所需代碼后,學(xué)生信息實體類的基本設(shè)計就完成了。2.2.2代碼展示

1usingSystem;

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

3*類名:Student

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

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

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是只讀屬性,因為它只有g(shù)et訪問器。

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

61~66 這是一個公有無返回值(void)的函數(shù),有3個參數(shù)。該函數(shù)用來編輯學(xué)生的學(xué)號、地址和郵編。由關(guān)鍵字void修飾的函數(shù)無需return語句。本任務(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+="兩個學(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類的兩個實例stu1和stu2。

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

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

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

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

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

1.類和對象

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

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

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

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

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

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

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

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

3.?return語句

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

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

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

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

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

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

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

{

//方法的主體…

//由return語句返回

}

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

classAdd

{

publicintSum(intpara1,intpara2)

{

returnpara1+para2;

}

}使用實例方法:

AddmyAdd=newAdd(); //實例化一個對象

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;

}

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

publicstringSum(stringpara1,stringpara2)

{

returnpara1+para2;

}

publicdoubleSum(doublepara1)

{

returnpara1+para1;

}2.2.4知識點2——域和屬性

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

1.添加域

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

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

●?new

●?public

●?protected

●?internal

●?private

●?static

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

publicstaticreadonlydoublePI=3.14159;

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

2.域(字段)的初始化

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

3.添加屬性

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

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

publicintClassID

{

get{}

set{}

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

●?new

●?public

●?protected

●?internal

●?private

●?static

●?virtual

●?sealed

●?override

●?abstract

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

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

privateintage;//年齡

publicintAge

{

get{returnage;}

set

{

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

{

age=value;

}

else

{

age=0;

}

}

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

在屬性的訪問聲明中:

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

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

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

添加方法和索引器的向?qū)υ捒蛞荒苛巳?,這里就不一一列舉了。2.2.5知識點3——調(diào)試:查看對象變量的內(nèi)容

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

2.3.1功能描述

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

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

publicStudent()

{}

publicStudent(inti,strings1,strings2,strings3)

{

this.classID=i;

this.studentNO=s1;

this.studentname=s2;

this.sex=s3;

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

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

Studentstu3=newStudent();

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

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知識點1——構(gòu)造函數(shù)和析構(gòu)函數(shù)

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

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

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

publicStudent()

{

publicStudent(stringname,intage,stringhobby)

{

=name;

this.age=age;

this.hobby=hobby;

}

}

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

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論