深入淺出C中文版第四章_第1頁
深入淺出C中文版第四章_第2頁
深入淺出C中文版第四章_第3頁
深入淺出C中文版第四章_第4頁
深入淺出C中文版第四章_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、文檔來源為:從網絡收集整理.word 版本可編輯.歡迎下載支持Head First C#中文版第四章連載地址(每日更新):下載:/2728712/SWPU崔鵬飛翻譯,歡迎提出其中的錯誤。數據類型,數據庫,少校數據(譯注:電視劇星際迷航中的內容)這些都是很重要的東西。 沒有數據,你的程序就毫無用處。你需要從用戶那兒接受信息,你 用這些數據來尋找或產生新信息并返回給用戶。實際上,你在程序中做的每件事都是用某種方式處理數據。在這一章,你將會學習到C#數據類型的來來龍去脈,學到如何在程序中處理數據,甚至還會學到一點兒對象的小緋聞(對象也是數據)。變量的類型決定它可以存儲哪種數據C#有15種內建值類型,

2、每種存儲不同種類的數據。你已經見過一些最普遍的了,你也知道 怎么使用它們。還有一些你沒見過,其實它們也是很好用的。 你總是會用到值類型* int可以存儲從-48到47的整數* String可以存儲任意長度的文本(包括空字符串)* bool是布爾值-或者是true或者是false* float可以存儲從. . ' ' 至ij ' I" 的最高七位有效數字的任意小數。這個 范圍看起來很奇怪很復雜,其實很簡單。有效數字意味著數的精度::.仆I: I門,11丁都有七位有效數字。1038意味著你最大可以存儲1038級別的數字。10-45意味著最小可以存儲的數量級。更多種

3、整數很久以前,內存很貴,cpu很慢。還有,信不信由你,如果你用了錯誤的類型,它會嚴重的減慢你的程序。幸運的是,時代不同了,現在如果你需要存儲一個整數,用int就可以了。但是有時候你需要更大的或者更小的。所以C#給了你更多選擇:* byte可以存儲0到255之間的整數* sbyte可以存儲-127到128之間的整數* short可以存儲-32767到32768之間的整數* ushort可以存儲0到95之間的整數* long可以存儲正負 0000之間的數字* ushort可以存儲0到00000之間的數字存儲超大 和極小數字的類型有時候七位有效數字還不夠。信不信由你,有的時候十的三十八次方不夠大,十

4、的負四十五次方還不夠小。有些關于財政或者科學研究的程序會遇到這種問題,所以C#給了我們另外兩種類型:字面值也有類型你向C#程序中鍵入一個數字,就是在使用字面值每一個字面值都會自動的匹配為一個類型。你可以自己看一下-鍵入這一行,把14.7賦值給int變量:intmyInt=14.7;如果把int值賦值給double變量也會得到一樣的結果。IDE告訴你14.7有一個類型-它是double。你可以在末尾添加一個F來把它變成float(14.7F)。14.7M是一個decimal。更多的內建值類型你注意到byte有256個可能的值了嗎?嗯,還有一個類型也有256個可能的值:char。但是它不是數字:你

5、用它存儲字符。Char的字面值總是在單引號包圍下(x,3)。你也可以在但括號里面放轉義字符('n'是換行,'t'是制表符)。最后,還有一個重要的類型:object。你已經看見了,一個object可以繼承自另一個object,而這個object還可以繼承自一個不同的object。每一個繼承鏈條的頂部都是object。這很有用,因為你可以把任何的值,變量,或者是對象賦值給一個object變量。一個變量就像是一個裝著數據的杯子你的所有數據都占一些內存。(還記得上一章的堆嗎?)所以你的工作的一部分就是在程序里使用字符串或者數字的時候考慮需要多少空間。這就是需要使用變量的

6、部分原因。這可以讓你在內存中開辟足夠的空間來存儲你的數據。把變量想象為一個裝著數據的杯子。C#用不同的杯子裝不同種類的數據。就像咖啡館里有不同大小的杯子一樣,變量也大小不一。有小數位的數字和整數存儲方式不同。你可以用float來存儲大多數小數,這是可以存儲小數的最小類型。需要更精確的話可以用double。如果你在寫一個需要非常精確地科學計算類的程序的話,decimal是最精確地。并不總是數字。C#編譯器也可以處理字符和非數字類型。char類型存儲一個字符,string存儲一些捆綁到一起的字符。String類型也沒有固定長度。它會隨著你向里面存儲數據來擴張長度。bool數據類型用來存儲true或

7、者false值,就像你在if語句里面用的一樣。削足適履你把變量聲明為什么類型,編譯器就會怎么對待它。即使變量值遠遠不到其變量類型的上限,編譯器也只會看到裝著變量的杯子,而不是變量值。所以,這樣做是不行的:20000可以放在short里面,沒問題。但是由于leaguesUnderTheSea被聲明為int,編譯器就會把它當做int看待,認為它太大了,放不進一個short容器里。編譯器不會為你做這個轉換。你需要確定你使用的變量類型對于數據來說是正確的。即使一個數字大小合適,你也不能把它賦值給其他變量我們來看看把一個decimal值賦值給int變量會怎樣。1 創(chuàng)建一個項目并添加一個按鈕。然后把下面幾

8、行代碼添加到按鈕的Click()方法:2 試著編譯程序。啊你會得到一個下面這樣的錯誤:3 通過把decimal類型轉換為int來消除錯誤。一旦你像下面這樣改變了代碼的第二行,你的程序就可以編譯運行了:怎么樣?編譯器不允許你把一個錯誤類型的值賦值給一個變量-即使這個變量可以存放這個值也不可以-因為這會是潛在的bug的起因。你在使用類型轉換的時候,你就是在本質上向編譯器保證你知道類型不同,你也知道讓C#把這個實例轉換為新的變量類型是合理的。當你給一個過大的值轉型的時候,C#將會自動的調整它的值你已經見過一個decimal值可以轉型為int。實際上,任何數字類型都可以轉換為任何其他數字類型。但是這并

9、不意味著轉型過程中值可以保持不變。假設你要把一個值為365的int轉型為byte變量,365對byte來說太大了。這并不會出錯,值會繞回去:比如說256轉化為byte會變成0,257轉換后是1,258轉換為2,等等,到了365,將會轉換為109。一到了255,轉換值就會返回到0。對!+運算符為你做類型轉換你使用的+運算符自動為你做類型轉換-很智能的。當你用+來把數字或者布爾值加到字符串上,它將會自動的把加的值轉換為字符串。如果你用+(或者*、/、-)來運算兩個不同的類型,比較小的類型將會自動轉換為較大的類型。這兒是一個例子:由于int適合于車專換為float,而float不適合車專換為int,

10、所以+運算符在相加之前把myInt轉換成float。你并不是總可以把任何類型轉換為其他任何類型。創(chuàng)建一個新項目,拖拽一個按鈕到窗體,并把這些語句寫進它的方法去。然后生成程序-將會有很多錯誤提示。圈出會出錯的語句。這將會幫你搞明白哪些類型可以轉換,而哪些不可以。C#會自動的做一些類型轉換有兩種重要的類型轉換不需要你自己去做類型轉換。第一個是當你使用算術運算符時自動進行的轉換,就像下面的例子一樣:另一種C#自動為你轉換類型的情況是用加號連接string。當你用加號運算符連接一個string和另一種其他的類型,C#會自動把數字類型轉換為string。下面是一個例子。前兩行沒錯,但是第三行無法編譯。C

11、#編譯器會給出一個關于無效參數的錯誤。這是因為MessageBox.Show()方法的參數是string,而在這兒傳遞了一個long,這是錯誤的類型。但是你可以通過調用它的ToSring()方法來很簡單的把它轉換為stringo每種類型都有ToString()方法。這樣你就可以把x轉換為MessageBox.Show()需要的參數類型。調用方法的時候,變量必須匹配參數的類型試著調用MessageBox.Show(123)-傳給方法一個字面值(123)而不是一個string。這無法編譯,IDE將會給出一個錯誤提示:“參數1,無法從int轉換為string”。MessageBox.Show()并非

12、是唯一在參數類型錯誤時會給出錯誤的方法,所有方法都這樣兒,你自己寫的方法也是。試著把下面的完整有效的代碼寫進一個類里面:IDE給出你一個“無效參數”錯誤的話,這意味著你試著用錯誤的參數類型來調用方法。如果你傳遞的參數正如方法所預期就可以正常編譯-調用MyMethod(true)或者MyMethod(false)都可以編譯。如果你傳遞給它一個int或者string會怎樣?IDE將會給出一個與上面類似的錯誤?,F在試著傳給它一個布爾值并把返回值賦值給一個long變量或者把返回值傳遞給MessageBox.Show()方法。這也不對-這個方法返回的是一個int,不是long或者MessageBox.S

13、how()期待的string。If語句總是測試來看看是不是有東西是true的你注意到我們是這么寫if語句的了嗎:If(yesNo)不一定要明確的寫“if(yesNo=true)”。因為If語句總是測試來看看是不是有東西是true的。可以用嘆號來檢查是不是有東西是false的(或者NOT運算符也可以)?!癷f(!yesNo)”和“if(yesNo=false)”是一樣的。從現在開始,后面的示例代碼將會經常使用“if(yesNo)”或"if(!yesNo)”,而不會明確的檢查一個布爾值是true還是false。C#里大概有77個預留詞。這些詞被C#編譯器預留:你不可以用它們作為變量名。這

14、本書看完的時候你將會很了解他們了。下面是你已經用過的。寫下你認為這些詞在C#里面是做什么的。>答案在161頁給一個商業(yè)旅行創(chuàng)建一個補貼計算器。它允許用戶輸入一個開始里程數還有一個結束里程數。根據這兩個數字,它將會計算出走了多少英里并計算出公司應該補貼多少錢,前提是每英里公司補貼0.39美元。1 從一個窗體項目開始把窗體創(chuàng)建成這樣兒:當你把窗體料理好之后,雙擊按鈕,向項目添加一些代碼。2 創(chuàng)建你的計算器需要的變量在Form1類的頂部定義變量。你需要兩個整數來保存開始里程表數和結束里程表數。把它們叫做startingMileage和endingMileage。你需要三個可以保存小數的地方。給

15、它們命名為mileTraveled,reimburseRate和amountOwed。給reimburseRate賦值為0.39。3 讓你的計算器可以工作向button1_Click()方法添加代碼來:* 確定開始里程數小于結束里程數。如果不是,顯示一個消息框,說:“開始里程數需要小于結束里程數”。讓消息框的標題為“無法計算”。* 用這些代碼行來從結束里程數中減去開始里程數,并乘以補貼率:4運行確定它給出的數字是正確的。試著把開始里程數設置的比結束里程數大,并確保程序會給出一個消息框。這是練習第一部分的代碼1 現在向窗體添加另一個按鈕這樣做來在計算完公司欠多少補貼之后顯示旅行了多少英里昨晚找你

16、這些后雙擊DisplayMiles來向項目添加一些代碼。2 一行代碼就搞定我們要做的就是在窗體上顯示milesTraveled變量,對吧?所以這一行就可以做到。3 運行鍵入一些值來看看會怎么樣。4 啊,有東西錯了.英里數總是和補貼款數相符,怎么回事?把等號和其他運算符結合起來好好看看我們用來從結束里程數中減去開始里程數的運算符(-=)。問題是它不僅做減法,而且它還把值賦給減號左邊的變量。用旅行的里程數乘以補貼率的時候也是一樣的。我們將會用-和*代替*=和-=。在這兒,好的變量名會有幫助嗎?當然!仔細看看每個變量是做什么的。你從milesTraveled這個名字就可以得到很多線索-你知道這個變量

17、在窗體中顯示的不對,而且你也知道這個值應該怎么計算得來。所以你可以利用這一點來在代碼中尋找bug。如果錯誤代碼是下面這樣的,找到問題就困難多了:對象也是變量迄今為止,我們是把對象與其他類型區(qū)別看待的。但是對象就是另一種數據類型。你的代碼像處理數字,字符串,和布爾值一樣來處理對象。代碼用變量來處理它們:對象就是你的程序可以使用的另一種類型的變量。如果你的程序需要用一個很大的數字,使用long。需要一個比較小的數字,使用short。如果需要會犬吠會坐下的東西,使用Dog。無論你的程序需要什么類型的數據,都將會使用變量。用引用變量來引用對象創(chuàng)建對象時,寫類似于newGuy的代碼。但是這還不夠;即使在

18、堆里面創(chuàng)建了一個新的Guy對象,這并沒有給你訪問對象的方式。你需要一個對象的引用。所以你需要創(chuàng)建一個引用變量;一個有名字的Guy類型變量,名字類似于Joe。這樣,Joe就是你新創(chuàng)建的Guy對象的引用。任何時候你想用這個對象,都可以通過叫做Joe的引用變量來引用它。所以如果你有一個對象類型的變量,它就是一個引用變量:一個指向特殊對象的引用??纯聪旅妫阂镁拖袷悄愕膶ο蟮臉撕炘谀愕膹N房里,你大概會有盛糖和鹽的容器。如果你交換了它們的標簽,那你就會做出一頓相當難吃的飯了-因為雖然標簽換了,但是容器里的內容還是沒有變。引用就像是標簽。你可以移動標簽,把它們指向不同的東西,但是指揮什么方法和數據是可用的

19、的對象,而不是引用本身。你不可以直接指向對象。比如說,如果Guy是一個對象類型的話,你不可以寫Guy.GiveCash()這樣的代碼。C#編譯器不知道你指的是哪一個Guy對象,因為你在堆內可能有多個Guy的實例。所以你需要一個像Joe這樣的引用變量,你可以把一個實例賦值給它,比如Guyjoe=newGuy()?,F在,你可以這樣調用方法:joe.GiveCash()。Joe指向一個Guy類的實例,C#編譯器就知道需要用哪個實例了。就像上面你看到的那樣,可能會有多個標簽指向這同一個實例。所以你可以寫Guydad=joe,然后調用dad.GiveCash()方法。這樣是可以-Joe的孩子每天都這樣做

20、。你的代碼需要使用內存中的對象的時候,它要使用引用,這個引用是一個它要指向的對象的類型的變量。一個引用就像一個你的代碼使用的標簽,這個標簽指向某個特定的對象。如果沒有引用指向你的對象了,它就會被垃圾收集掉如果所有的標簽都從一個對象上摘掉了,就沒有程序可以訪問這個對象了。這意味著C#可以標記對象以便垃圾收集。這時候C#就會把無引用的對象消除,并回收那些對象占用的內存來供你的程序使用。多引用及其副作用挪動引用變量的時候你要小心一點。很多時候,你好像只是把一個變量移動到一個不同的對象上去。但是,你有可能會最終把所有的引用都指向了另一個對象。這并不是很壞,但是它有違你本意,看看下面:現在該你來了。下面

21、是一段很長的代碼。分析出每一階段有多少對象和引用。在右手邊畫出對象和標簽在堆中的情況。現在該你來了。下面是一段很長的代碼。分析出每一階段有多少對象和引用。在右手邊畫出對象和標簽在堆中的情況。創(chuàng)建一個有大象類程序的程序。創(chuàng)建兩個大象的實例并讓它們交換屬性,不要讓它們被垃圾收集了哦。1創(chuàng)建一個新的窗體應用項目把窗體做的像這樣:2創(chuàng)建日ephant(大象)類5文檔來源為:從網絡收集整理.word版本可編輯.歡迎下載支持向項目中添加一個大象類??纯创笙箢惖念悎D-你需要一個叫做EarSize的int字段和一個叫做Name的String字段。(確保兩個字段都是public的)然后添加一個叫做WhoAml(

22、)的方法,它顯示一個消息框,告訴你大象的耳朵長度和大象的名字。3創(chuàng)建兩個大象實例和一個引用向Form1類添加兩個日ephant實例(就在類聲明的下面)。命名為Lloyd和Lucinda。初始化它們讓它們有正確的名字和耳朵大小。下面是大象的對象初始化器,你需要把它添加到你的窗體:4讓"Lloyd"和"Lucinda”按鈕工作讓Lloyd按鈕調用lloyd.WhoAmI()方法,讓Lucinda按鈕調用lucinda.WhoAmI()方法。5處理swap(交換)按鈕這兒是比較難的部分。讓swap按鈕交換兩個引用,所以你點擊Swap按鈕的時候,lloyd和lucinda

23、變量交換對象并且顯示一個“對象已經交換了"消息框。測試你的程序,點擊交換按鈕然后點擊另外兩個按鈕。第一次你點擊Swap,Llyod按鈕將會顯示Lucinda的消息框,Lucinda按鈕將會顯示Llyod的消息框。再點擊一次swap,一切就又恢復了。C#垃圾收集任何沒有引用指向的對象。所以下面是一個提示:如果你想把一杯啤酒倒入一個裝滿水的杯子里面,你需要有第三個杯子來把水倒進去.創(chuàng)建一個有大象類程序的程序。創(chuàng)建兩個大象的實例并讓它們交換屬性,不要讓它們被垃圾收集了哦。兩個引用意味著有兩條路徑來修改一個對象的數據除了失去對一個對象的全部引用之外,當你有一個對象的很多引用的時候,你可能會無

24、意的修改了一個對象。換句話說,有可能一個對象的某個引用修改了對象,而另外一個引用還不知道對象被修改了??聪旅妫?向窗體在添加一個按鈕2向按鈕添加這些代碼。你能猜到你點擊這個按鈕會發(fā)生什么嗎?3OK,去點擊這個新按鈕吧。等一會兒,顯示出來的是Lucinda的消息框。我們不是調用的Llyod的WhoAmI()方法嗎?一個特例:arrays(數組)如果你需要保持很多同類型的數據,比如一列高度或者一組狗狗,你可以使用一個數組-就像你在給SloppyJoe做三明治菜單的時候用的一樣。數組的特殊之處在于它是被當做一個對象的一組變量。數組讓你可以保持和修改多個數據而無須分別保持這些數據。聲明數組的時候,就像

25、聲明其他變量一樣,用一個名字和類型:像使用一般變量一樣來使用數組內的每個元素這兒是一段聲明并填充數組的代碼的例子-還有這么做的時候堆內的情況。數組里的第一個元素的位序是0。數組也可以存儲很多的引用變量你可以像創(chuàng)建數字或字符串的數組一樣,來創(chuàng)建一個對象引用的數組。數組并不關心它存儲的是什么類型的變量;這取決于你。所以你可以有int數組,Duck對象的數組,都沒問題。下面的代碼創(chuàng)建了一個含有七個Dog的數組。初始化數組的那一行只是創(chuàng)建了引用變量。由于只有兩個有newDog()的行,所以實際上只創(chuàng)建了兩個Dog類的實例。MenuMakerRandomizer Meats Condiments Bre

26、ads當你在數組中存取元素的時候,方括號里面的數字叫做位序。數組里面的第一個元素的位序是0。歡迎光臨SloppyJoe的打折三明治店!GetMenullemO11SloppyJoe有一大堆肉,很多面包,還有多的你數不清的作料。不是他沒有菜單!你可以給他寫一個每天產生一個新的隨機菜單的程序嗎?1創(chuàng)建一個新項目并添加一個MeneMaker類如果你要創(chuàng)建一個菜單,那么你需要配料。用數組是很適合的。我們還需要把配料隨機組合進一個三明治的方式。很幸運,.NETFramework有一個叫做Random的內置類,它可以產生隨機數。所以我們的類里會有四個字段:一個Randomizer字段保持一個Random對

27、象的引用,三個數組來保持肉,作料,和面包。這個秋第字找件對羅班一*. ti II/: j對衣抬引閉叫L匚1UU I。謂用七代i Random!zer;Meats = 體不同字加中然縱沙們夾構施出物長勺殺率碰Turkey*,噂4m",''Pa5trani* );Candimentd vyellow Custar Hbrcwn E",匕 /mustafd". 、it r , "七電工i5h* *frenchi dre與£i,niQ|心才(方strinall1*ryent"hit色,wheat*,*purapernickaL

28、,舛將金產箕*iErb-3-工:陽,;汨住,田方傳號朱訪間朝且口即電闔口12添加一個GetMenItem()方法來生成一個隨機三明治。這個類的要點就是生成三明治,那么我們就添加一個方法來做這件事吧。它將會用Random對象的Next0方法來從三個數組中選擇隨機的肉,作料和面包。你給Next()方法傳遞一個int參數,它將會返回一個小于這個int值的隨機數。那么,如果你的Random對象叫做Randomizer,調用Randomizer.Next(7)將會返回一個0至U6之間的隨機數。那你怎么知道給Next0傳遞什么參數呢?這個簡單-傳進每個數組的Length屬性就好了。這樣就可以返回一個數組的

29、隨機位序。3創(chuàng)建你的窗體向窗體添加六個窗體,label1到label6。然后添加代碼用MenuMaker對象來設置每個label的Text屬性。你將會需要用一個Random類的新實例來初始化對象。下面是代碼:對象用引用來與彼此通話到目前為止,你已經看見過窗體通過引用變量來與對象通話,來調用對象的方法訪問他們的字段。對象也可以通過用引用來調用彼此的方法。實際上沒有窗體可以做而你的對象做不到的事兒,因為你的窗體也是一個對象。當對象與彼此通話的時候this關鍵字是很有用的。一個對象用this關鍵字的時候,就是在引用它自己-它是指向調用者本身的引用。1這兒是一個方法告訴大象去說話我們給曰ephant類

30、添加一個方法。它的第一個方法是來自大象的一個消息。第二個方法是說這句話的大象。下面是它被調用的時候它看起來的樣子:我們調用lloyd的TellMe()方法,給他傳遞兩個參數:“Hi”和一個Lucinda的對象引用。這個方法用它的whoSaidIt參數訪問被傳進TellMe()方法來的大象對象的Name屬性。2這兒是一個調用另一個方法的方法現在我們向大象類添加SpeakTo()方法。它用一個特殊關鍵字:this。這是一個讓對象引用自己的引用。我們來仔細看看它是怎么工作的。Lucinda的SpeakTo。方法被調用的時候,它用它的talkTo引用參數來調用lloyd的TellMe()方法。所以110yd表現的好像被以參數(“Hello",Lucinda)調用,并顯示上面這個消息框。對象沒去過的地方還有一個你將會用的關鍵字。當你創(chuàng)建一個引用并不把它設置為任何值的時候,它還是有值。它的初始值是null,意味著它不指向任何東西。問:再問一下-我的窗體是一個對象?答:對!這就是你的類的代碼以類定義開始的原因。然后打開任何一個你寫過的程序的Program.cs文件,在InitializeComponent()方法中看一看-你將會找到"ne

溫馨提示

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

評論

0/150

提交評論