13第講深入理解語言7小結s_第1頁
13第講深入理解語言7小結s_第2頁
13第講深入理解語言7小結s_第3頁
13第講深入理解語言7小結s_第4頁
13第講深入理解語言7小結s_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C#程序設計及應用唐大仕dstang2000Copyright © by ARTCOM PTs.C#程序設計深入理解C#語言第14章深入理解C#語言唐大仕dstang20002 唐大仕 C#程序設計內容提要 類型與轉換 變量及其傳遞 多態(tài)與虛方法調用 動態(tài)類型確定 對象構造與析構 csharp語言新特性3 唐大仕 C#程序設計深入理解C#語言1 類型與轉換4 唐大仕 類型與轉換Now LoadingC#程序設計數(shù)據(jù)類型 C#的數(shù)據(jù)類型兩大類 值類型(Value Type)p 簡單類型(Simple Type)p 結構類型(Struct Type)p 枚舉類型(Enum Type)類型

2、類型(Reference Type)p 類類型(Class Type)p 數(shù)組類型(Array Type)p 指代類型(Delegate)6 唐大仕 C#程序設計Reference and Value Types(Struct)(Class)變量中的內容實際值Heap 堆Inline 棧分配NullZeroed默認值= 的含義值iint i = 123;string s = "Helloworld""Hello world"sjint j = i;string t = s;t 唐大7Reference型Value 值仕 123123C#程序設計示例pqd

3、ay monthyearm堆內存n棧內存C唐l大a仕sStruct.cs8C#程序設計值類型的轉換 數(shù)字類型之間可以互相轉化p 隱式轉換p 顯式轉換p 整型提升floatint i sbytef= 3;(int)3.14;a=1,b=2; a+b為int型 枚舉類型與數(shù)字類型之間可以顯式轉換(強制類型轉換) 結構類型之間不能轉換9 唐大仕 C#程序設計類型轉換 顯式或隱式轉換(都要求有繼承關系)p = new Student();/隱式轉換p/ 顯式轉換p Student s = (Student) p; 可能轉,也可能異常p IRunnable r = p;/隱式轉換 as 運算符p Stu

4、dent s = p as Student; 可能,也可能為nullA唐s大O仕ct.cs10C#程序設計類型與值類型的轉換int i = 123;object o = i;int j =(int)o;ioSystem.Int32“Boxing”?“Unboxing”j11 唐大仕 123123123C#程序設計Boxing and unboxingUnboxing必須顯式轉換B唐o大仕xTest.cs12C#程序設計int total = 35;string s = String.Format("Your total was 0 on 1", total, date);H

5、ashtable t = new Hashtable();t.Add(0,t.Add(1,"zero");"one");DateTimeString sd = DateTime.Now;= d.ToString();/no boxint a = newa0 = 33;int2;/no boxArrayList aa.Add(33);=new ArrayList();/box here13 唐大仕 C#程序設計深入理解C#語言2 變量及其傳遞14 唐大仕 變量及其傳遞Now LoadingC#程序設計域變量及局部變量 類static變量p 相當于類中的“全

6、局變量” 域變量p 相當于對象中的變量 局部變量p 在函數(shù)體及其中,在棧中分配,自動消失 域變量自動有初值,局部變量則不L唐o大c仕rAndMemberVar.cs16C#程序設計按值傳送的參數(shù) 按值傳送p 要注意值類型與類型TransByValueStructClass.csp TransByValue.cs17 唐大仕 C#程序設計ref參數(shù)及out參數(shù) ref參數(shù)在傳之間必先賦值 out參數(shù)在函數(shù)中必須賦值后才能返回 表達式及對象的屬性不能作ref及out參數(shù)p TransByRef.csp RefSwap.csp TransByOut.csp RefColorRGB.cs18 唐大仕

7、C#程序設計params參數(shù) 數(shù)組參數(shù)(相當于VB的可變參數(shù)) 如 string.的Split(params char); 參數(shù)必須放在最后 調用時,可用數(shù)組,也可用多個參數(shù)p 定義: double Multi( params double nums )p 調用 Multi(); Multi( 27 ); Multi( 3.14, 0.9, 0.9 ); Multi( 1,2,3,4,5); Multi( new double 1,2,3,4,5);P唐a大仕rTest.cs19C#程序設計默認參數(shù) 在參變量中使用 如:p void ZoomIn( Point p,p 調用時可以這樣 Zoom

8、In( p,1.5)double k = 1) ZoomIn( p )相當于 ZoomIn( p,1) 唐大仕 2020C#程序設計深入理解C#語言3多態(tài)與虛方法調用21 唐大仕 多態(tài)及虛方法Now LoadingC#程序設計多態(tài)(Polymorphism) 在面向對象的系統(tǒng)中,多態(tài)性是一個非常重要的概念,它客戶對一個對象進行操作,由對象來完成一系列的動作,具體實現(xiàn)哪個動作、如何實現(xiàn)由系統(tǒng)負責解釋。 在C#中,多態(tài)性的定義是,同一操作作用于不同的類的實例,不同的類將進行不同的解釋,最后產生不同的執(zhí)行結果。C#支持兩種類型的多態(tài)性。唐大4仕- 23 C#程序設計兩種類型的多態(tài)性 編譯時的多態(tài)性p

9、 編譯時的多態(tài)是通過重載來實現(xiàn)的。對于非虛的成員來說,系統(tǒng)在編譯時,根據(jù)傳遞的參數(shù)、返回的類型等信息決定實現(xiàn)何種操作。 運行時的多態(tài)性p 運行時的多態(tài)性是指直到系統(tǒng)運行時,才根據(jù)實際情況決定實現(xiàn)何種操作。C#中,運行時的多態(tài)性通過虛成員實現(xiàn)。 編譯時的多態(tài)性提供了運行速度快的特點,而運行時的多態(tài)性則帶來了高度靈活和抽象的特點。24 唐大仕 C#程序設計上溯造型與虛方法調用static void doStuff( Shape s ) s.draw();Shape ShapeShapec = new Circle();r = new Rectangle();s = new Square();doS

10、tuff(c); doStuff(r);doStuff(s);V唐i大r仕tnvokeShape.cs25C#程序設計虛方法的語范 必須有virtual或abstract或override所修飾。 虛方法不能省略符,不能是private的,不能是static的,因為它們應該可以被子類所覆蓋。 子類中要覆蓋父類的虛方法,必須用override。 否則認為是新(new)的一個方法,并隱藏了父類的方法,實行虛方法調用。 覆蓋和被覆蓋的方法必須有相同的可同的返回類型。性和相26 唐大仕 C#程序設計虛方法與非虛方法的區(qū)別 虛方法調用的方法是由對象實例的類型所決定 非虛方法調用的方法是由所的對象變量來決

11、定的。V唐i大r仕tAndNoneVirtual.cs27C#程序設計最可派生的方法 當多次派生,并有virtual與非virtual方法時V唐i大r仕tComplex.cs28C#程序設計深入理解C#語言4 動態(tài)類型確定29 唐大仕 動態(tài)類型確定Now LoadingC#程序設計is運算符 用于運行時對象的類型 格式:對象 is 類型p 不是nullp 可轉換,而不異常I唐s大T仕cs31C#程序設計= 與 != 值類型相等類型的相等p是是否是同一對象p 除非重載了=及!=操作p 對于string等類型,已經進行了重載p 對于兩個boxing的對象,=總是false32 唐大仕 C#程序設計

12、得到類型信息 typeof運算符p typeof(System.Console) 對象.GetType() Type.GetType(string 類名)T唐y大p仕tType.csTypeGetMembers.cs33C#程序設計反射 反射ReflectionR唐e大仕flonTest.cs34C#程序設計深入理解C#語言5 對象構造與析構35 唐大仕 對象構造與析構Now LoadingC#程序設計構造方法 構造方法的初始化部分,使用this及basep 調用本類或父類的構造方法p 不用this且不用base,則會自動認為base()class AA(int a)class B : AB(

13、String s )ctCallThisAndBase.cs/編譯不能通過C唐o大仕n37C#程序設計域的初始化 域的初始化中不能this 在base被調用之前不能thisclass B : Aint x = 1;int M() return 1; int y = x+M(); /ErrorB():base(x)/Error38 唐大仕 C#程序設計構造方法的執(zhí)行過程 執(zhí)行過程p 若有this(),轉向之p 執(zhí)行域的初始化p 轉到basep 執(zhí)行方法體 應避免在構造方法中調用任何虛方法C唐o大仕nctorExecution.cs39C#程序設計靜態(tài)構造方法 靜態(tài)構造方法總是在該類的所有靜態(tài)域初

14、始化之后執(zhí)行; 靜態(tài)構造方法總是在該類被使用(如成; 靜態(tài)構造方法最多被執(zhí)行一次。靜態(tài)域、生成實例)之前完 靜態(tài)構造方法的執(zhí)行順序的不確定性,所以在使用構造方法時應謹慎 應盡量避免在靜態(tài)初始化或靜態(tài)域中出現(xiàn)循環(huán)的情況。p static int a=b+1;static int b=a+1;40 唐大仕 C#程序設計析構方法 析構方法p 類名() 析構方自動調用父類的析構方法 注:p 編譯器生成的構造方法名字為ctor()p 生成的析構方法名字為Finalize() 不能顯式地調用析構方法41 唐大仕 C#程序設計自動回收回收(garbage collection) 自動回收 “強制”回收Sys

15、tem.GC.Collect();String a,b;a = String.Copy("hello world"); b = String.Copy("game over"); Console.WriteLine(a+b+"ok"); a = null;a = b;42 唐大仕 C#程序設計顯式管理 實現(xiàn)IDisposable接口 其中有方法:p voidDispose();43 唐大仕 C#程序設計使用using語句44 唐大仕 using ( R r1 = new R() ) r1.F();R r1 = new R();try

16、r1.F();finally if (r1 != null)(IDisposable)r1).Dispose();C#語言新特性Now LoadingC#程序設計csharp語言新特性 C#2.0引入泛型 C#3.0引入Lambda及Linq C#4.0引入動態(tài)特性 dynamic C#5.0引入并行及異步 async/await及Task C#6.0改進編譯,屬性初始化46 唐大仕 C#程序設計泛型(Generic) C#2.0 List<Book> books=new List<Book>(); Book book = books0; /以前要用強制類型轉換 Arr

17、ayList books = new ArrayList(); Book book =(Book) books0;47 唐大仕 C#程序設計常用的泛型的delegate Func<T, TResult>p 多個參數(shù)Func<T1, T2, T3, T4, TResult> Action<T>p 多個參數(shù)Action<T1, T2, T3, T4> Predicate<T> Comparison<T> Converter<TInput,TOutput> EventHandler<TEventArgs>

18、48 唐大仕 C#程序設計方法 C#2.0 delegate(參數(shù)) 方法體 可以當一個委托p new Thread( new ThreadStart( delegate() . ) ); 可以被隱式轉換為一個兼容的委托類型p new Thread(delegate() . );49 唐大仕 C#程序設計Lambda表達式 C#3.0 常見的形式p from c in customersp where c.Age>10p orderby c.Namep select 相當于new c.Name, c.Phonep customersp .Where(c=> c.Age>10)

19、p .OrderBy(c => c.Name).p .Select(c => new c.Name, c.Phone )Linq示例:50 唐大仕 C#程序設計LinqC# 3.0 常見的形式p from c in customersp where c.Age>10p orderby c.Namep select 相當于new c.Name, c.Phonep customersp .Where(c=> c.Age>10)p .OrderBy(c => c.Name).p .Select(c => new c.Name, c.Phone )Linq示例

20、:51 唐大仕 C#程序設計擴展方法 C#3.0 用于擴展一個類,給對象加上方法 public static class T public static bool IsLonger(this string str, int n) return str!=null && str.Length>n; 使用string s = “abc”; Console.Write( s.IsLonger(2) ); 唐大仕 5252C#程序設計動態(tài)語言特性 C#4.0 dynamic 可以動態(tài)表示任意對象,在編譯時不進行語法檢查 /ExpandoObject:表示一個對象,該對象包含可在運

21、行時動態(tài)添加和移除的成員。 dynamic expando=new ExpandoObject(); expando.Name = "DebugLZQ" expando.Speak = new Action()=>Console.Writee("My name is 0",expando.Name ); expando.Speak(); 主要用于與COM組件的交互 dynamiccell = new Cell(); cell.Formula = “=SUM(A1:A3)”; 唐大仕 5353C#程序設計異步編程 C#5.0 async及awaitTask<double> FacAsync(int n) return Task<double>.Run( ()=>return s

溫馨提示

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

最新文檔

評論

0/150

提交評論