![深入淺出C中文版第四章_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/12/70123a7f-b236-4c02-9bfc-d978d7adce94/70123a7f-b236-4c02-9bfc-d978d7adce941.gif)
![深入淺出C中文版第四章_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/12/70123a7f-b236-4c02-9bfc-d978d7adce94/70123a7f-b236-4c02-9bfc-d978d7adce942.gif)
![深入淺出C中文版第四章_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/12/70123a7f-b236-4c02-9bfc-d978d7adce94/70123a7f-b236-4c02-9bfc-d978d7adce943.gif)
![深入淺出C中文版第四章_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/12/70123a7f-b236-4c02-9bfc-d978d7adce94/70123a7f-b236-4c02-9bfc-d978d7adce944.gif)
![深入淺出C中文版第四章_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/12/70123a7f-b236-4c02-9bfc-d978d7adce94/70123a7f-b236-4c02-9bfc-d978d7adce945.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、文檔來源為:從網(wǎng)絡(luò)收集整理.word 版本可編輯.歡迎下載支持Head First C#中文版第四章連載地址(每日更新):下載:/2728712/SWPU崔鵬飛翻譯,歡迎提出其中的錯(cuò)誤。數(shù)據(jù)類型,數(shù)據(jù)庫,少校數(shù)據(jù)(譯注:電視劇星際迷航中的內(nèi)容)這些都是很重要的東西。 沒有數(shù)據(jù),你的程序就毫無用處。你需要從用戶那兒接受信息,你 用這些數(shù)據(jù)來尋找或產(chǎn)生新信息并返回給用戶。實(shí)際上,你在程序中做的每件事都是用某種方式處理數(shù)據(jù)。在這一章,你將會(huì)學(xué)習(xí)到C#數(shù)據(jù)類型的來來龍去脈,學(xué)到如何在程序中處理數(shù)據(jù),甚至還會(huì)學(xué)到一點(diǎn)兒對(duì)象的小緋聞(對(duì)象也是數(shù)據(jù))。變量的類型決定它可以存儲(chǔ)哪種數(shù)據(jù)C#有15種內(nèi)建值類型,
2、每種存儲(chǔ)不同種類的數(shù)據(jù)。你已經(jīng)見過一些最普遍的了,你也知道 怎么使用它們。還有一些你沒見過,其實(shí)它們也是很好用的。 你總是會(huì)用到值類型* int可以存儲(chǔ)從-48到47的整數(shù)* String可以存儲(chǔ)任意長度的文本(包括空字符串)* bool是布爾值-或者是true或者是false* float可以存儲(chǔ)從. . ' ' 至ij ' I" 的最高七位有效數(shù)字的任意小數(shù)。這個(gè) 范圍看起來很奇怪很復(fù)雜,其實(shí)很簡單。有效數(shù)字意味著數(shù)的精度::.仆I: I門,11丁都有七位有效數(shù)字。1038意味著你最大可以存儲(chǔ)1038級(jí)別的數(shù)字。10-45意味著最小可以存儲(chǔ)的數(shù)量級(jí)。更多種
3、整數(shù)很久以前,內(nèi)存很貴,cpu很慢。還有,信不信由你,如果你用了錯(cuò)誤的類型,它會(huì)嚴(yán)重的減慢你的程序。幸運(yùn)的是,時(shí)代不同了,現(xiàn)在如果你需要存儲(chǔ)一個(gè)整數(shù),用int就可以了。但是有時(shí)候你需要更大的或者更小的。所以C#給了你更多選擇:* byte可以存儲(chǔ)0到255之間的整數(shù)* sbyte可以存儲(chǔ)-127到128之間的整數(shù)* short可以存儲(chǔ)-32767到32768之間的整數(shù)* ushort可以存儲(chǔ)0到95之間的整數(shù)* long可以存儲(chǔ)正負(fù) 0000之間的數(shù)字* ushort可以存儲(chǔ)0到00000之間的數(shù)字存儲(chǔ)超大 和極小數(shù)字的類型有時(shí)候七位有效數(shù)字還不夠。信不信由你,有的時(shí)候十的三十八次方不夠大,十
4、的負(fù)四十五次方還不夠小。有些關(guān)于財(cái)政或者科學(xué)研究的程序會(huì)遇到這種問題,所以C#給了我們另外兩種類型:字面值也有類型你向C#程序中鍵入一個(gè)數(shù)字,就是在使用字面值每一個(gè)字面值都會(huì)自動(dòng)的匹配為一個(gè)類型。你可以自己看一下-鍵入這一行,把14.7賦值給int變量:intmyInt=14.7;如果把int值賦值給double變量也會(huì)得到一樣的結(jié)果。IDE告訴你14.7有一個(gè)類型-它是double。你可以在末尾添加一個(gè)F來把它變成float(14.7F)。14.7M是一個(gè)decimal。更多的內(nèi)建值類型你注意到byte有256個(gè)可能的值了嗎?嗯,還有一個(gè)類型也有256個(gè)可能的值:char。但是它不是數(shù)字:你
5、用它存儲(chǔ)字符。Char的字面值總是在單引號(hào)包圍下(x,3)。你也可以在但括號(hào)里面放轉(zhuǎn)義字符('n'是換行,'t'是制表符)。最后,還有一個(gè)重要的類型:object。你已經(jīng)看見了,一個(gè)object可以繼承自另一個(gè)object,而這個(gè)object還可以繼承自一個(gè)不同的object。每一個(gè)繼承鏈條的頂部都是object。這很有用,因?yàn)槟憧梢园讶魏蔚闹担兞?,或者是?duì)象賦值給一個(gè)object變量。一個(gè)變量就像是一個(gè)裝著數(shù)據(jù)的杯子你的所有數(shù)據(jù)都占一些內(nèi)存。(還記得上一章的堆嗎?)所以你的工作的一部分就是在程序里使用字符串或者數(shù)字的時(shí)候考慮需要多少空間。這就是需要使用變量的
6、部分原因。這可以讓你在內(nèi)存中開辟足夠的空間來存儲(chǔ)你的數(shù)據(jù)。把變量想象為一個(gè)裝著數(shù)據(jù)的杯子。C#用不同的杯子裝不同種類的數(shù)據(jù)。就像咖啡館里有不同大小的杯子一樣,變量也大小不一。有小數(shù)位的數(shù)字和整數(shù)存儲(chǔ)方式不同。你可以用float來存儲(chǔ)大多數(shù)小數(shù),這是可以存儲(chǔ)小數(shù)的最小類型。需要更精確的話可以用double。如果你在寫一個(gè)需要非常精確地科學(xué)計(jì)算類的程序的話,decimal是最精確地。并不總是數(shù)字。C#編譯器也可以處理字符和非數(shù)字類型。char類型存儲(chǔ)一個(gè)字符,string存儲(chǔ)一些捆綁到一起的字符。String類型也沒有固定長度。它會(huì)隨著你向里面存儲(chǔ)數(shù)據(jù)來擴(kuò)張長度。bool數(shù)據(jù)類型用來存儲(chǔ)true或
7、者false值,就像你在if語句里面用的一樣。削足適履你把變量聲明為什么類型,編譯器就會(huì)怎么對(duì)待它。即使變量值遠(yuǎn)遠(yuǎn)不到其變量類型的上限,編譯器也只會(huì)看到裝著變量的杯子,而不是變量值。所以,這樣做是不行的:20000可以放在short里面,沒問題。但是由于leaguesUnderTheSea被聲明為int,編譯器就會(huì)把它當(dāng)做int看待,認(rèn)為它太大了,放不進(jìn)一個(gè)short容器里。編譯器不會(huì)為你做這個(gè)轉(zhuǎn)換。你需要確定你使用的變量類型對(duì)于數(shù)據(jù)來說是正確的。即使一個(gè)數(shù)字大小合適,你也不能把它賦值給其他變量我們來看看把一個(gè)decimal值賦值給int變量會(huì)怎樣。1 創(chuàng)建一個(gè)項(xiàng)目并添加一個(gè)按鈕。然后把下面幾
8、行代碼添加到按鈕的Click()方法:2 試著編譯程序。啊你會(huì)得到一個(gè)下面這樣的錯(cuò)誤:3 通過把decimal類型轉(zhuǎn)換為int來消除錯(cuò)誤。一旦你像下面這樣改變了代碼的第二行,你的程序就可以編譯運(yùn)行了:怎么樣?編譯器不允許你把一個(gè)錯(cuò)誤類型的值賦值給一個(gè)變量-即使這個(gè)變量可以存放這個(gè)值也不可以-因?yàn)檫@會(huì)是潛在的bug的起因。你在使用類型轉(zhuǎn)換的時(shí)候,你就是在本質(zhì)上向編譯器保證你知道類型不同,你也知道讓C#把這個(gè)實(shí)例轉(zhuǎn)換為新的變量類型是合理的。當(dāng)你給一個(gè)過大的值轉(zhuǎn)型的時(shí)候,C#將會(huì)自動(dòng)的調(diào)整它的值你已經(jīng)見過一個(gè)decimal值可以轉(zhuǎn)型為int。實(shí)際上,任何數(shù)字類型都可以轉(zhuǎn)換為任何其他數(shù)字類型。但是這并
9、不意味著轉(zhuǎn)型過程中值可以保持不變。假設(shè)你要把一個(gè)值為365的int轉(zhuǎn)型為byte變量,365對(duì)byte來說太大了。這并不會(huì)出錯(cuò),值會(huì)繞回去:比如說256轉(zhuǎn)化為byte會(huì)變成0,257轉(zhuǎn)換后是1,258轉(zhuǎn)換為2,等等,到了365,將會(huì)轉(zhuǎn)換為109。一到了255,轉(zhuǎn)換值就會(huì)返回到0。對(duì)!+運(yùn)算符為你做類型轉(zhuǎn)換你使用的+運(yùn)算符自動(dòng)為你做類型轉(zhuǎn)換-很智能的。當(dāng)你用+來把數(shù)字或者布爾值加到字符串上,它將會(huì)自動(dòng)的把加的值轉(zhuǎn)換為字符串。如果你用+(或者*、/、-)來運(yùn)算兩個(gè)不同的類型,比較小的類型將會(huì)自動(dòng)轉(zhuǎn)換為較大的類型。這兒是一個(gè)例子:由于int適合于車專換為float,而float不適合車專換為int,
10、所以+運(yùn)算符在相加之前把myInt轉(zhuǎn)換成float。你并不是總可以把任何類型轉(zhuǎn)換為其他任何類型。創(chuàng)建一個(gè)新項(xiàng)目,拖拽一個(gè)按鈕到窗體,并把這些語句寫進(jìn)它的方法去。然后生成程序-將會(huì)有很多錯(cuò)誤提示。圈出會(huì)出錯(cuò)的語句。這將會(huì)幫你搞明白哪些類型可以轉(zhuǎn)換,而哪些不可以。C#會(huì)自動(dòng)的做一些類型轉(zhuǎn)換有兩種重要的類型轉(zhuǎn)換不需要你自己去做類型轉(zhuǎn)換。第一個(gè)是當(dāng)你使用算術(shù)運(yùn)算符時(shí)自動(dòng)進(jìn)行的轉(zhuǎn)換,就像下面的例子一樣:另一種C#自動(dòng)為你轉(zhuǎn)換類型的情況是用加號(hào)連接string。當(dāng)你用加號(hào)運(yùn)算符連接一個(gè)string和另一種其他的類型,C#會(huì)自動(dòng)把數(shù)字類型轉(zhuǎn)換為string。下面是一個(gè)例子。前兩行沒錯(cuò),但是第三行無法編譯。C
11、#編譯器會(huì)給出一個(gè)關(guān)于無效參數(shù)的錯(cuò)誤。這是因?yàn)镸essageBox.Show()方法的參數(shù)是string,而在這兒傳遞了一個(gè)long,這是錯(cuò)誤的類型。但是你可以通過調(diào)用它的ToSring()方法來很簡單的把它轉(zhuǎn)換為stringo每種類型都有ToString()方法。這樣你就可以把x轉(zhuǎn)換為MessageBox.Show()需要的參數(shù)類型。調(diào)用方法的時(shí)候,變量必須匹配參數(shù)的類型試著調(diào)用MessageBox.Show(123)-傳給方法一個(gè)字面值(123)而不是一個(gè)string。這無法編譯,IDE將會(huì)給出一個(gè)錯(cuò)誤提示:“參數(shù)1,無法從int轉(zhuǎn)換為string”。MessageBox.Show()并非
12、是唯一在參數(shù)類型錯(cuò)誤時(shí)會(huì)給出錯(cuò)誤的方法,所有方法都這樣兒,你自己寫的方法也是。試著把下面的完整有效的代碼寫進(jìn)一個(gè)類里面:IDE給出你一個(gè)“無效參數(shù)”錯(cuò)誤的話,這意味著你試著用錯(cuò)誤的參數(shù)類型來調(diào)用方法。如果你傳遞的參數(shù)正如方法所預(yù)期就可以正常編譯-調(diào)用MyMethod(true)或者M(jìn)yMethod(false)都可以編譯。如果你傳遞給它一個(gè)int或者string會(huì)怎樣?IDE將會(huì)給出一個(gè)與上面類似的錯(cuò)誤?,F(xiàn)在試著傳給它一個(gè)布爾值并把返回值賦值給一個(gè)long變量或者把返回值傳遞給MessageBox.Show()方法。這也不對(duì)-這個(gè)方法返回的是一個(gè)int,不是long或者M(jìn)essageBox.S
13、how()期待的string。If語句總是測(cè)試來看看是不是有東西是true的你注意到我們是這么寫if語句的了嗎:If(yesNo)不一定要明確的寫“if(yesNo=true)”。因?yàn)镮f語句總是測(cè)試來看看是不是有東西是true的。可以用嘆號(hào)來檢查是不是有東西是false的(或者NOT運(yùn)算符也可以)?!癷f(!yesNo)”和“if(yesNo=false)”是一樣的。從現(xiàn)在開始,后面的示例代碼將會(huì)經(jīng)常使用“if(yesNo)”或"if(!yesNo)”,而不會(huì)明確的檢查一個(gè)布爾值是true還是false。C#里大概有77個(gè)預(yù)留詞。這些詞被C#編譯器預(yù)留:你不可以用它們作為變量名。這
14、本書看完的時(shí)候你將會(huì)很了解他們了。下面是你已經(jīng)用過的。寫下你認(rèn)為這些詞在C#里面是做什么的。>答案在161頁給一個(gè)商業(yè)旅行創(chuàng)建一個(gè)補(bǔ)貼計(jì)算器。它允許用戶輸入一個(gè)開始里程數(shù)還有一個(gè)結(jié)束里程數(shù)。根據(jù)這兩個(gè)數(shù)字,它將會(huì)計(jì)算出走了多少英里并計(jì)算出公司應(yīng)該補(bǔ)貼多少錢,前提是每英里公司補(bǔ)貼0.39美元。1 從一個(gè)窗體項(xiàng)目開始把窗體創(chuàng)建成這樣兒:當(dāng)你把窗體料理好之后,雙擊按鈕,向項(xiàng)目添加一些代碼。2 創(chuàng)建你的計(jì)算器需要的變量在Form1類的頂部定義變量。你需要兩個(gè)整數(shù)來保存開始里程表數(shù)和結(jié)束里程表數(shù)。把它們叫做startingMileage和endingMileage。你需要三個(gè)可以保存小數(shù)的地方。給
15、它們命名為mileTraveled,reimburseRate和amountOwed。給reimburseRate賦值為0.39。3 讓你的計(jì)算器可以工作向button1_Click()方法添加代碼來:* 確定開始里程數(shù)小于結(jié)束里程數(shù)。如果不是,顯示一個(gè)消息框,說:“開始里程數(shù)需要小于結(jié)束里程數(shù)”。讓消息框的標(biāo)題為“無法計(jì)算”。* 用這些代碼行來從結(jié)束里程數(shù)中減去開始里程數(shù),并乘以補(bǔ)貼率:4運(yùn)行確定它給出的數(shù)字是正確的。試著把開始里程數(shù)設(shè)置的比結(jié)束里程數(shù)大,并確保程序會(huì)給出一個(gè)消息框。這是練習(xí)第一部分的代碼1 現(xiàn)在向窗體添加另一個(gè)按鈕這樣做來在計(jì)算完公司欠多少補(bǔ)貼之后顯示旅行了多少英里昨晚找你
16、這些后雙擊DisplayMiles來向項(xiàng)目添加一些代碼。2 一行代碼就搞定我們要做的就是在窗體上顯示milesTraveled變量,對(duì)吧?所以這一行就可以做到。3 運(yùn)行鍵入一些值來看看會(huì)怎么樣。4 啊,有東西錯(cuò)了.英里數(shù)總是和補(bǔ)貼款數(shù)相符,怎么回事?把等號(hào)和其他運(yùn)算符結(jié)合起來好好看看我們用來從結(jié)束里程數(shù)中減去開始里程數(shù)的運(yùn)算符(-=)。問題是它不僅做減法,而且它還把值賦給減號(hào)左邊的變量。用旅行的里程數(shù)乘以補(bǔ)貼率的時(shí)候也是一樣的。我們將會(huì)用-和*代替*=和-=。在這兒,好的變量名會(huì)有幫助嗎?當(dāng)然!仔細(xì)看看每個(gè)變量是做什么的。你從milesTraveled這個(gè)名字就可以得到很多線索-你知道這個(gè)變量
17、在窗體中顯示的不對(duì),而且你也知道這個(gè)值應(yīng)該怎么計(jì)算得來。所以你可以利用這一點(diǎn)來在代碼中尋找bug。如果錯(cuò)誤代碼是下面這樣的,找到問題就困難多了:對(duì)象也是變量迄今為止,我們是把對(duì)象與其他類型區(qū)別看待的。但是對(duì)象就是另一種數(shù)據(jù)類型。你的代碼像處理數(shù)字,字符串,和布爾值一樣來處理對(duì)象。代碼用變量來處理它們:對(duì)象就是你的程序可以使用的另一種類型的變量。如果你的程序需要用一個(gè)很大的數(shù)字,使用long。需要一個(gè)比較小的數(shù)字,使用short。如果需要會(huì)犬吠會(huì)坐下的東西,使用Dog。無論你的程序需要什么類型的數(shù)據(jù),都將會(huì)使用變量。用引用變量來引用對(duì)象創(chuàng)建對(duì)象時(shí),寫類似于newGuy的代碼。但是這還不夠;即使在
18、堆里面創(chuàng)建了一個(gè)新的Guy對(duì)象,這并沒有給你訪問對(duì)象的方式。你需要一個(gè)對(duì)象的引用。所以你需要?jiǎng)?chuàng)建一個(gè)引用變量;一個(gè)有名字的Guy類型變量,名字類似于Joe。這樣,Joe就是你新創(chuàng)建的Guy對(duì)象的引用。任何時(shí)候你想用這個(gè)對(duì)象,都可以通過叫做Joe的引用變量來引用它。所以如果你有一個(gè)對(duì)象類型的變量,它就是一個(gè)引用變量:一個(gè)指向特殊對(duì)象的引用??纯聪旅妫阂镁拖袷悄愕膶?duì)象的標(biāo)簽在你的廚房里,你大概會(huì)有盛糖和鹽的容器。如果你交換了它們的標(biāo)簽,那你就會(huì)做出一頓相當(dāng)難吃的飯了-因?yàn)殡m然標(biāo)簽換了,但是容器里的內(nèi)容還是沒有變。引用就像是標(biāo)簽。你可以移動(dòng)標(biāo)簽,把它們指向不同的東西,但是指揮什么方法和數(shù)據(jù)是可用的
19、的對(duì)象,而不是引用本身。你不可以直接指向?qū)ο?。比如說,如果Guy是一個(gè)對(duì)象類型的話,你不可以寫Guy.GiveCash()這樣的代碼。C#編譯器不知道你指的是哪一個(gè)Guy對(duì)象,因?yàn)槟阍诙褍?nèi)可能有多個(gè)Guy的實(shí)例。所以你需要一個(gè)像Joe這樣的引用變量,你可以把一個(gè)實(shí)例賦值給它,比如Guyjoe=newGuy()?,F(xiàn)在,你可以這樣調(diào)用方法:joe.GiveCash()。Joe指向一個(gè)Guy類的實(shí)例,C#編譯器就知道需要用哪個(gè)實(shí)例了。就像上面你看到的那樣,可能會(huì)有多個(gè)標(biāo)簽指向這同一個(gè)實(shí)例。所以你可以寫Guydad=joe,然后調(diào)用dad.GiveCash()方法。這樣是可以-Joe的孩子每天都這樣做
20、。你的代碼需要使用內(nèi)存中的對(duì)象的時(shí)候,它要使用引用,這個(gè)引用是一個(gè)它要指向的對(duì)象的類型的變量。一個(gè)引用就像一個(gè)你的代碼使用的標(biāo)簽,這個(gè)標(biāo)簽指向某個(gè)特定的對(duì)象。如果沒有引用指向你的對(duì)象了,它就會(huì)被垃圾收集掉如果所有的標(biāo)簽都從一個(gè)對(duì)象上摘掉了,就沒有程序可以訪問這個(gè)對(duì)象了。這意味著C#可以標(biāo)記對(duì)象以便垃圾收集。這時(shí)候C#就會(huì)把無引用的對(duì)象消除,并回收那些對(duì)象占用的內(nèi)存來供你的程序使用。多引用及其副作用挪動(dòng)引用變量的時(shí)候你要小心一點(diǎn)。很多時(shí)候,你好像只是把一個(gè)變量移動(dòng)到一個(gè)不同的對(duì)象上去。但是,你有可能會(huì)最終把所有的引用都指向了另一個(gè)對(duì)象。這并不是很壞,但是它有違你本意,看看下面:現(xiàn)在該你來了。下面
21、是一段很長的代碼。分析出每一階段有多少對(duì)象和引用。在右手邊畫出對(duì)象和標(biāo)簽在堆中的情況?,F(xiàn)在該你來了。下面是一段很長的代碼。分析出每一階段有多少對(duì)象和引用。在右手邊畫出對(duì)象和標(biāo)簽在堆中的情況。創(chuàng)建一個(gè)有大象類程序的程序。創(chuàng)建兩個(gè)大象的實(shí)例并讓它們交換屬性,不要讓它們被垃圾收集了哦。1創(chuàng)建一個(gè)新的窗體應(yīng)用項(xiàng)目把窗體做的像這樣:2創(chuàng)建日ephant(大象)類5文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持向項(xiàng)目中添加一個(gè)大象類??纯创笙箢惖念悎D-你需要一個(gè)叫做EarSize的int字段和一個(gè)叫做Name的String字段。(確保兩個(gè)字段都是public的)然后添加一個(gè)叫做WhoAml(
22、)的方法,它顯示一個(gè)消息框,告訴你大象的耳朵長度和大象的名字。3創(chuàng)建兩個(gè)大象實(shí)例和一個(gè)引用向Form1類添加兩個(gè)日ephant實(shí)例(就在類聲明的下面)。命名為Lloyd和Lucinda。初始化它們讓它們有正確的名字和耳朵大小。下面是大象的對(duì)象初始化器,你需要把它添加到你的窗體:4讓"Lloyd"和"Lucinda”按鈕工作讓Lloyd按鈕調(diào)用lloyd.WhoAmI()方法,讓Lucinda按鈕調(diào)用lucinda.WhoAmI()方法。5處理swap(交換)按鈕這兒是比較難的部分。讓swap按鈕交換兩個(gè)引用,所以你點(diǎn)擊Swap按鈕的時(shí)候,lloyd和lucinda
23、變量交換對(duì)象并且顯示一個(gè)“對(duì)象已經(jīng)交換了"消息框。測(cè)試你的程序,點(diǎn)擊交換按鈕然后點(diǎn)擊另外兩個(gè)按鈕。第一次你點(diǎn)擊Swap,Llyod按鈕將會(huì)顯示Lucinda的消息框,Lucinda按鈕將會(huì)顯示Llyod的消息框。再點(diǎn)擊一次swap,一切就又恢復(fù)了。C#垃圾收集任何沒有引用指向的對(duì)象。所以下面是一個(gè)提示:如果你想把一杯啤酒倒入一個(gè)裝滿水的杯子里面,你需要有第三個(gè)杯子來把水倒進(jìn)去.創(chuàng)建一個(gè)有大象類程序的程序。創(chuàng)建兩個(gè)大象的實(shí)例并讓它們交換屬性,不要讓它們被垃圾收集了哦。兩個(gè)引用意味著有兩條路徑來修改一個(gè)對(duì)象的數(shù)據(jù)除了失去對(duì)一個(gè)對(duì)象的全部引用之外,當(dāng)你有一個(gè)對(duì)象的很多引用的時(shí)候,你可能會(huì)無
24、意的修改了一個(gè)對(duì)象。換句話說,有可能一個(gè)對(duì)象的某個(gè)引用修改了對(duì)象,而另外一個(gè)引用還不知道對(duì)象被修改了??聪旅妫?向窗體在添加一個(gè)按鈕2向按鈕添加這些代碼。你能猜到你點(diǎn)擊這個(gè)按鈕會(huì)發(fā)生什么嗎?3OK,去點(diǎn)擊這個(gè)新按鈕吧。等一會(huì)兒,顯示出來的是Lucinda的消息框。我們不是調(diào)用的Llyod的WhoAmI()方法嗎?一個(gè)特例:arrays(數(shù)組)如果你需要保持很多同類型的數(shù)據(jù),比如一列高度或者一組狗狗,你可以使用一個(gè)數(shù)組-就像你在給SloppyJoe做三明治菜單的時(shí)候用的一樣。數(shù)組的特殊之處在于它是被當(dāng)做一個(gè)對(duì)象的一組變量。數(shù)組讓你可以保持和修改多個(gè)數(shù)據(jù)而無須分別保持這些數(shù)據(jù)。聲明數(shù)組的時(shí)候,就像
25、聲明其他變量一樣,用一個(gè)名字和類型:像使用一般變量一樣來使用數(shù)組內(nèi)的每個(gè)元素這兒是一段聲明并填充數(shù)組的代碼的例子-還有這么做的時(shí)候堆內(nèi)的情況。數(shù)組里的第一個(gè)元素的位序是0。數(shù)組也可以存儲(chǔ)很多的引用變量你可以像創(chuàng)建數(shù)字或字符串的數(shù)組一樣,來創(chuàng)建一個(gè)對(duì)象引用的數(shù)組。數(shù)組并不關(guān)心它存儲(chǔ)的是什么類型的變量;這取決于你。所以你可以有int數(shù)組,Duck對(duì)象的數(shù)組,都沒問題。下面的代碼創(chuàng)建了一個(gè)含有七個(gè)Dog的數(shù)組。初始化數(shù)組的那一行只是創(chuàng)建了引用變量。由于只有兩個(gè)有newDog()的行,所以實(shí)際上只創(chuàng)建了兩個(gè)Dog類的實(shí)例。MenuMakerRandomizer Meats Condiments Bre
26、ads當(dāng)你在數(shù)組中存取元素的時(shí)候,方括號(hào)里面的數(shù)字叫做位序。數(shù)組里面的第一個(gè)元素的位序是0。歡迎光臨SloppyJoe的打折三明治店!GetMenullemO11SloppyJoe有一大堆肉,很多面包,還有多的你數(shù)不清的作料。不是他沒有菜單!你可以給他寫一個(gè)每天產(chǎn)生一個(gè)新的隨機(jī)菜單的程序嗎?1創(chuàng)建一個(gè)新項(xiàng)目并添加一個(gè)MeneMaker類如果你要?jiǎng)?chuàng)建一個(gè)菜單,那么你需要配料。用數(shù)組是很適合的。我們還需要把配料隨機(jī)組合進(jìn)一個(gè)三明治的方式。很幸運(yùn),.NETFramework有一個(gè)叫做Random的內(nèi)置類,它可以產(chǎn)生隨機(jī)數(shù)。所以我們的類里會(huì)有四個(gè)字段:一個(gè)Randomizer字段保持一個(gè)Random對(duì)
27、象的引用,三個(gè)數(shù)組來保持肉,作料,和面包。這個(gè)秋第字找件對(duì)羅班一*. ti II/: j對(duì)衣抬引閉叫L匚1UU I。謂用七代i Random!zer;Meats = 體不同字加中然縱沙們夾構(gòu)施出物長勺殺率碰Turkey*,噂4m",''Pa5trani* );Candimentd vyellow Custar Hbrcwn E",匕 /mustafd". 、it r , "七電工i5h* *frenchi dre與£i,niQ|心才(方strinall1*ryent"hit色,wheat*,*purapernickaL
28、,舛將金產(chǎn)箕*iErb-3-工:陽,;汨住,田方傳號(hào)朱訪間朝且口即電闔口12添加一個(gè)GetMenItem()方法來生成一個(gè)隨機(jī)三明治。這個(gè)類的要點(diǎn)就是生成三明治,那么我們就添加一個(gè)方法來做這件事吧。它將會(huì)用Random對(duì)象的Next0方法來從三個(gè)數(shù)組中選擇隨機(jī)的肉,作料和面包。你給Next()方法傳遞一個(gè)int參數(shù),它將會(huì)返回一個(gè)小于這個(gè)int值的隨機(jī)數(shù)。那么,如果你的Random對(duì)象叫做Randomizer,調(diào)用Randomizer.Next(7)將會(huì)返回一個(gè)0至U6之間的隨機(jī)數(shù)。那你怎么知道給Next0傳遞什么參數(shù)呢?這個(gè)簡單-傳進(jìn)每個(gè)數(shù)組的Length屬性就好了。這樣就可以返回一個(gè)數(shù)組的
29、隨機(jī)位序。3創(chuàng)建你的窗體向窗體添加六個(gè)窗體,label1到label6。然后添加代碼用MenuMaker對(duì)象來設(shè)置每個(gè)label的Text屬性。你將會(huì)需要用一個(gè)Random類的新實(shí)例來初始化對(duì)象。下面是代碼:對(duì)象用引用來與彼此通話到目前為止,你已經(jīng)看見過窗體通過引用變量來與對(duì)象通話,來調(diào)用對(duì)象的方法訪問他們的字段。對(duì)象也可以通過用引用來調(diào)用彼此的方法。實(shí)際上沒有窗體可以做而你的對(duì)象做不到的事兒,因?yàn)槟愕拇绑w也是一個(gè)對(duì)象。當(dāng)對(duì)象與彼此通話的時(shí)候this關(guān)鍵字是很有用的。一個(gè)對(duì)象用this關(guān)鍵字的時(shí)候,就是在引用它自己-它是指向調(diào)用者本身的引用。1這兒是一個(gè)方法告訴大象去說話我們給曰ephant類
30、添加一個(gè)方法。它的第一個(gè)方法是來自大象的一個(gè)消息。第二個(gè)方法是說這句話的大象。下面是它被調(diào)用的時(shí)候它看起來的樣子:我們調(diào)用lloyd的TellMe()方法,給他傳遞兩個(gè)參數(shù):“Hi”和一個(gè)Lucinda的對(duì)象引用。這個(gè)方法用它的whoSaidIt參數(shù)訪問被傳進(jìn)TellMe()方法來的大象對(duì)象的Name屬性。2這兒是一個(gè)調(diào)用另一個(gè)方法的方法現(xiàn)在我們向大象類添加SpeakTo()方法。它用一個(gè)特殊關(guān)鍵字:this。這是一個(gè)讓對(duì)象引用自己的引用。我們來仔細(xì)看看它是怎么工作的。Lucinda的SpeakTo。方法被調(diào)用的時(shí)候,它用它的talkTo引用參數(shù)來調(diào)用lloyd的TellMe()方法。所以110yd表現(xiàn)的好像被以參數(shù)(“Hello",Lucinda)調(diào)用,并顯示上面這個(gè)消息框。對(duì)象沒去過的地方還有一個(gè)你將會(huì)用的關(guān)鍵字。當(dāng)你創(chuàng)建一個(gè)引用并不把它設(shè)置為任何值的時(shí)候,它還是有值。它的初始值是null,意味著它不指向任何東西。問:再問一下-我的窗體是一個(gè)對(duì)象?答:對(duì)!這就是你的類的代碼以類定義開始的原因。然后打開任何一個(gè)你寫過的程序的Program.cs文件,在InitializeComponent()方法中看一看-你將會(huì)找到"ne
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 食品留樣制度在宴會(huì)餐飲中的應(yīng)用
- 智慧小醫(yī)生養(yǎng)成記醫(yī)學(xué)觀察的初步體驗(yàn)
- 智能制造成功案例現(xiàn)代辦公自動(dòng)化發(fā)展
- 文學(xué)創(chuàng)作與學(xué)生創(chuàng)新能力培養(yǎng)
- 教育信息化背景下學(xué)生體能的提升策略
- 教育科技小學(xué)生注意力訓(xùn)練游戲的未來趨勢(shì)
- 智慧醫(yī)療在促進(jìn)家庭健康中的作用
- 小學(xué)生通過數(shù)學(xué)學(xué)習(xí)科學(xué)知識(shí)的路徑研究
- 營養(yǎng)餐在校園健康管理中的作用與推廣
- 教育行業(yè)實(shí)驗(yàn)室設(shè)備采購與技術(shù)支持策略
- 鋰電新能源項(xiàng)目融資計(jì)劃書
- 重大危險(xiǎn)源的風(fēng)險(xiǎn)評(píng)估模型
- 采購支出管理制度
- 混凝土試件臺(tái)賬
- 人機(jī)料法環(huán)測(cè)檢查表
- 中國數(shù)字貨運(yùn)發(fā)展報(bào)告
- 使用AVF血液透析患者的護(hù)理查房
- 《幼兒教師職業(yè)道德》教案
- 2021年高考山東卷化學(xué)試題(含答案解析)
- 客服百問百答
評(píng)論
0/150
提交評(píng)論