版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、1,孫月江 ,1,第八章 理解值和引用,理解值類型和引用類型的區(qū)別 使用ref和out關鍵字 裝箱操作 拆箱操作,C#中的類型綜述,程序設計語言中為什么需要類型 編譯時的內(nèi)存分配 定義于類型上的方法 C#中類型的分類: 預定義類型 .Net框架類庫中的預編寫類型:Console和Math 自定義類型:Person C#中的預定義類型: 簡單類型:關鍵性的基本類型,共13種 派生預定義類型:string,C#:一個強類型語言 賦值語句 方法調(diào)用時,對調(diào)用體參數(shù)的傳遞 表達式,8.1 復制值類型的變量和類,將一個變量聲明為值類型時,編譯器將分配足以容納這種值的一個內(nèi)存空間,例如: 聲明一個int類
2、型的變量,編譯器分配4個字節(jié)的空間 賦值時,將導致值被復制到該內(nèi)存塊中 將一個變量聲明為引用類型時,編譯器不會分配足以容納整個類型對象的內(nèi)存塊 相反,它會分配一小片內(nèi)存,用于容納一個地址,值類型與引用類型的分配,int i = 42; int copyi = i; i+;,Circle c = new Circle(42); Circle refc = c;,一個值類型的變量保存對應的實際值,引用變量包含了一個對計算機存儲器中對象的引用,它本身并不包含此對象 string myText; myText = Lets go to the C to catch a #;,C#主要類型,示例程序:R
3、eferenceTest.cs,01: using System; 02: 03: /* 04: * This class gives an example of 05: * a difference between reference 06: * types and value types 07: */ 08: 09: class Person 10: 11: private int age = 0; 12: 13: public void SetAge(int newAge) 14: 15: age = newAge; 16: 17: 18: public int GetAge() 19:
4、 20: return age; 21: 22: 23:,24: class ReferenceTester 25: 26: public static void Main() 27: 28: Person julian; 29: Person deborah; 30: 31: julian = new Person(); 32: deborah = new Person(); 33: julian.SetAge(2); 34: deborah.SetAge(33); 35: Console.WriteLine(Julians age: + julian.GetAge(); 36: Conso
5、le.WriteLine(Deborahs age: + deborah.GetAge(); 37: julian = deborah; 38: Console.WriteLine(Julians age: + julian.GetAge(); 39: Console.WriteLine(Deborahs age: + deborah.GetAge(); 40: julian.SetAge(10); 41: Console.WriteLine(Julians age: + julian.GetAge(); 42: Console.WriteLine(Deborahs age: + debora
6、h.GetAge(); 43: 44: ,課本137頁練習,8.2 理解null值和可空類型,C#允許將null值賦給任意引用變量 值為null的變量表明該變量不引用內(nèi)存中的任何對象 例如: Circle c=new Circle(42); Circle copy;/未初始化 if( copy = = /不能確定此處應放置的內(nèi)容) copy = c; 應修改為 Circle c=new Circle(42); Circle copy;/未初始化 if( copy = = null) copy = c;,8.2.1 使用可空類型,null在初始化引用類型時非常有用,但null本身就是一個引用,不
7、能把它賦給一個值類型 例如:int i=null;/非法 但是,利用?修飾符可以將一個變量聲明為一個可空值類型 可空值類型在行為上與普通值類型相似,但可以將一個null值賦給它 例如:int ?i=null;/合法,可以將具有恰當值類型的一個表達式直接賦給一個可空變量 int? i = null; int j = 99; i = 100; / Copy a value type constant to a nullable type i = j; / Copy a value type variable to a nullable type 不可將一個可空的值賦給一個普通的值類型的變量 j =
8、 i; / Illegal 考慮到變量i可能包含null,如果一個方法希望接收的是一個普通的值類型參數(shù),就不能將一個可空的變量作為實參傳給他 例如: int? i = 99; Pass.Value(i); / Compiler error,8.2.2 理解可為空類型的屬性,可空類型對外揭示了兩個屬性 HasValue屬性指出一個可空類型是包含一個真正的值,還是包含null 如果包含一個真正的值,可以利用Value屬性來獲取這個值 示例: int? i = null; . if (!i.HasValue) i = 99; else Console.WriteLine(i.Value);,當然,可
9、以直接使用if(i=null),比HasValue更直接 當創(chuàng)建更復雜的值類型,并用它們來聲明可空的變量,使用HasValue 和Value屬性就會優(yōu)勢盡顯 可控類型的Value屬性是只讀的,可以利用這個屬性讀取一個變量的值,但不能修改它。,8.3 使用ref和out參數(shù),向方法傳遞一個實參時,隨便在方法內(nèi)部進行什么修改,都不會影響作為參數(shù)來傳遞的一個變量的原始的值。 示例: static void DoIncrement(int param) param+; static void Main() int arg = 42; DoIncrement(arg); Console.WriteLin
10、e(arg); / writes 42, not 43 ,8.3.1 創(chuàng)建ref參數(shù),如果為一個參數(shù)附加了ref關鍵字作為前綴,該參數(shù)就會成為實參的一個別名(或者對實參的一個引用),而不再是實參的一個副本 使用ref參數(shù)時,向參數(shù)應用的任何操作,都會同樣應用于形參,因為形參和實參應用的是同一個對象 static void DoIncrement(ref int param) / using ref param+; static void Main() int arg = 42; DoIncrement(ref arg); / using ref Console.WriteLine(arg);
11、/ writes 43 ,變量使用前必須賦值,該規(guī)則同樣適用于ref實參 示例: static void DoIncrement(ref int param) param+; static void Main() int arg; / not initialized DoIncrement(ref arg); Console.WriteLine(arg); ,8.3.2 創(chuàng)建out參數(shù),編譯器會在調(diào)用方法之前,驗證它的ref參數(shù)已被賦值 然而,某些時候,我們可能希望由方法本身來初始化參數(shù),所以希望向其傳遞一個未初始化的實參。 out關鍵字正是針對這一問題 在向方法傳遞一個out參數(shù)之后,必須在
12、方法的內(nèi)部對其進行賦值 錯誤: static void DoInitialize(out int param) / Do nothing 正確: static void DoInitialize(out int param) param = 42; ,由于out參數(shù)必須在方法中賦值,所以調(diào)用方法時不需要對實參進行初始化。 static void DoInitialize(out int param) param = 42; static void Main() int arg; / not initialized DoInitialize(out arg); Console.WriteLine
13、(arg); / writes 42 ,課本144頁練習,8.4計算機內(nèi)存的組織方式,操作系統(tǒng)和runtime通常將用于容納數(shù)據(jù)的內(nèi)存劃分為兩個獨立的區(qū)域 每個區(qū)域采取不同的方式進行管理:棧和堆 調(diào)用一個方法時,它的參數(shù)以及它的局部變量需要的內(nèi)存總是從棧中獲取,方法結(jié)束后,為參數(shù)和局部變量分配的內(nèi)存將自動歸還給棧 使用new關鍵字創(chuàng)建一個對象時,構(gòu)造對象所需的內(nèi)存總是從堆中獲取,所有值類型都是在棧上創(chuàng)建的,所有引用類型都是在堆上創(chuàng)建的 可空類型實際是引用類型,所以在堆上創(chuàng)建,public int AddFive(int pValue)int result;result = pValue + 5
14、; return result; 首先方法(只包含需要執(zhí)行的邏輯字節(jié),即執(zhí)行該方法的指令,而非方法體內(nèi)的數(shù)據(jù))入棧,緊接著是方法的參數(shù)入棧。,堆類似于散布在房間中的箱子,每個箱子都有一個標簽,它標記了這個箱子是否正在使用 創(chuàng)建一個新對象時,runtime會查找一個空箱子,并把它分配給對象。 Runtime將跟蹤每個箱子的引用數(shù)量,一旦最后一個引用消失,運行時就將箱子標記為“未使用”。,使用棧和堆,void Method(int param) Circle c; c = new Circle(param); . 假設傳遞給param的值為42 雖然對象本身是在堆中建立的,但對象的引用是在棧中存儲
15、的 堆內(nèi)存是一種有限的資源,如果堆內(nèi)存耗盡,new操作符將拋出一個OutOfMemoryException,對象創(chuàng)建將失敗。,22,8.5 System.Object類,.NET Framework最重要的引用類型之一就是System命名空間中的Object類 System.Object類的別名是object,23,8.6裝箱,object類型的變量可以引用任何引用類型的任何對象 object也可以引用一個值類型 示例: int i = 42; object o = i; 說明:runtime在堆中分配一小片內(nèi)存,然后i中的值的一個副本被復制到這篇內(nèi)存中,最后讓o引用這個副本 這種將一個數(shù)據(jù)項
16、從棧自動復制到堆的行為稱為裝箱,24,如果修改一個變量的原始值,堆上的現(xiàn)有值是不會發(fā)生變化的,因為它只是一個副本 同樣,修改堆上的值,變量的原始值也不會發(fā)生變化,25,8.7拆箱,Circle c = new Circle(); int i = 42; object o; o = c; / o refers to a circle i = o; / what is stored in i? 為了訪問已裝箱的值,必須進行一次強制類型轉(zhuǎn)換 該操作會檢查是否能夠安全的將一種類型轉(zhuǎn)化成另一種類型,然后再進行轉(zhuǎn)換 int i = 42; object o = i; / boxes i = (int)o; / compiles okay,26,27,8.8數(shù)據(jù)類型的安全轉(zhuǎn)換,進行強制類型轉(zhuǎn)換,可能存在內(nèi)存中的對象與指定的類型不匹配的情況,導致runtime拋出異常 C#語言提供了兩個相當有用的操作符,有助于以更得體的方式進行強制類型轉(zhuǎn)換,28,8.8.1 is操作符,可以使用is操作符驗證對象的類型是不是自己希望的 WrappedInt wi = new Wrappe
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)院醫(yī)??颇甓裙ぷ骺偨Y(jié)
- 退役軍人服務保障體系標準化建設
- 求職者面試技巧全套教程
- 一般工貿(mào)行業(yè)新員工三級安全培訓考試試題及答案
- 建設工程施工合同糾紛要素式起訴狀模板修改無約束
- 不用熬夜寫!建設工程施工合同糾紛要素式起訴狀模板現(xiàn)成用
- 保險講師培訓
- 環(huán)境友好催化技術(shù)課件
- 調(diào)色年終總結(jié)和配料(3篇)
- 公務員法執(zhí)行情況自查報告
- 2026年游戲AB測試實施方法含答案
- 2025湖南湘西鶴盛原煙發(fā)展有限責任公司招聘擬錄用人員筆試歷年備考題庫附帶答案詳解
- 江蘇省2025年普通高中學業(yè)水平合格性考試英語試卷(含答案)
- 枕骨骨折的護理課件
- TCEC電力行業(yè)數(shù)據(jù)分類分級規(guī)范-2024
- 駱駝的養(yǎng)殖技術(shù)與常見病防治
- GB/T 26951-2025焊縫無損檢測磁粉檢測
- 2025及未來5-10年高壓管匯項目投資價值市場數(shù)據(jù)分析報告
- 腹部手術(shù)圍手術(shù)期疼痛管理指南(2025版)課件
- 2025年衛(wèi)生人才評價考試(臨床醫(yī)學工程技術(shù)中級)歷年參考題庫含答案
- 呼吸康復科普脫口秀
評論
0/150
提交評論