版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、案例2 教學管理軟件,案例簡介,2,需求概述,在學校教務管理系統(tǒng)中,有三種用戶,一種是系統(tǒng)管理員,一種是學生,一種是教師,編寫C#類實現(xiàn)該繼承關(guān)系。系統(tǒng)管理員/學生/教師都有用戶名和密碼屬性,并都有Login和顯示自身信息的方法,另外,學生擁有班級和成績兩個特殊屬性以及查詢成績這一方法,教師擁有部門和工資兩個特殊屬性以及查詢工資這一方法,系統(tǒng)管理員可以添加學生和教師信息。由于教師和學生個人信息不同,所以學生和教師重載基類的DisplayInfo方法。,3,需求分析,對于此類問題,首先應該抽象三類用戶共有的特征,在此基礎上,再派生普通類型的用戶,類關(guān)系圖如圖1所示。,圖1 繼承關(guān)系,4,實現(xiàn)過程
2、,1、創(chuàng)建控制臺應用程序,命名為“SchoolManagement”。 2、創(chuàng)建名為User的基類,基類定義了userName和password屬性,以及Login和DisplayInfo方法。 3、創(chuàng)建名為“Student”的派生類,具備班級和成績兩個特殊屬性,以及查詢成績的特殊方法,覆蓋基類的顯示個人信息方法。 4、創(chuàng)建名為“Teacher”的派生類,具備部門和工資兩個特殊屬性,以及查詢工資的特殊方法,覆蓋基類的顯示個人信息方法。 5、創(chuàng)建名為“SysManager”的派生類,具備插入學生信息和插入教師信息兩個方法。 6、在“Program.cs”的“Main”方法中調(diào)用以上類,測試。,5
3、,結(jié)果演示,6,主要知識點,類的聲明、類的成員、構(gòu)造函數(shù)和析構(gòu)函數(shù) 方法的聲明、方法的參數(shù)、靜態(tài)方法與實例方法、方法的覆蓋與重載 屬性 類的繼承與多態(tài) 接口,案例2 教學管理軟件,知識點詳解,面向?qū)ο缶幊趟枷?9,本章要點,理解面向?qū)ο蟮闹匾?掌握類的概念 掌握對象的概念 掌握類的組成 掌握封裝的概念 掌握變量的作用域,10,面向?qū)ο蟾攀?問題引入 大型軟件開發(fā):類似騰訊QQ的聊天軟件 復雜的代碼功能如果都集中在一個Program.cs文件中是不現(xiàn)實的,需要對代碼進行組織,將功能相近的代碼分類整合,從而便于代碼的管理和團隊開發(fā) 。,11,面向?qū)ο蟾攀?問題引入 在C#程序設計中,按照問題模型
4、特征以及施加在該模型上的操作,分類管理代碼的編程模式稱為面向?qū)ο蟮某绦蛟O計方法(OOP)。在需求分析和系統(tǒng)設計領域,還有面向?qū)ο蟮姆治?OOA)和面向?qū)ο蟮脑O計(OOD)等。面向?qū)ο蟮能浖_發(fā)模式,是解決復雜且多變的客觀問題的有效手段,也是從事軟件開發(fā)工作的一項必備能力。,12,面向?qū)ο蟾攀?面向?qū)ο蟪绦蛟O計 在計算機世界中,將事物的特征稱為屬性,將事物的行為或施加在事物上的操作稱為方法,這種對求解問題模型抽象其屬性和方法,分類編寫代碼的開發(fā)過程就是面向?qū)ο蟮某绦蛟O計(OOP)過程 類:具有相同的特征和行為的事物 對象:具體事務,這些事物具有靜態(tài)的特征和動態(tài)的行為,13,面向?qū)ο蟾攀?14,面
5、向?qū)ο蟾攀?面向?qū)ο蟪绦蛟O計 對象和類之間的關(guān)系是具體到抽象,特殊到一般的關(guān)系,15,面向?qū)ο蟾攀?程序設計的公式 程序=算法+數(shù)據(jù)結(jié)構(gòu) 程序=對象+對象間的消息傳遞 對象間的消息傳遞是指對象間的關(guān)聯(lián),16,類,在程序設計中,用類(class)來描述具有相同結(jié)構(gòu)和特征,以及相同的行為的一組對象,也可以把類看作對象的類型,把對象看作類的變量,從而對照前幾章的內(nèi)容來理解類,例如整型int,就是所有在一定的范圍內(nèi)的整數(shù)的集合,對于這些整數(shù)的操作必須是相同的。,17,類,1、C#中的命名慣例是類名的第一個字母大寫 2、如果類名有多個單詞,則每個單詞的第一個字母大寫,類的聲明,18,類,類的封裝 通過訪
6、問修飾符,C#實現(xiàn)了類的封裝思想 類的封裝是面向?qū)ο蟮奶卣髦?,通過封裝使一 部分成員充當類與外部的接口,而將其他的成員隱蔽 起來,這樣就達到了對成員訪問權(quán)限的合理控制,使 不同類之間的相互影響減少到最低限度,進而增強數(shù) 據(jù)的安全性和簡化程序的編寫工作。 例如:個人信息,有些可以公開,有些屬于隱私,19,類,類的封裝 訪問修飾符,20,類和對象,21,類和對象,22,類的字段,字段: 在類中存儲信息的成員,23,字段的訪問級別,類成員的默認訪問級別private,24,訪問控制修飾符,25,訪問控制修飾符,internal protected internal 當父類和子類不在同一個程序集中時
7、, 子類不能訪問父類的internal成員。,26,靜態(tài)字段,27,類的靜態(tài)字段,、,訪問實例字段:car1.color=“Blue”; 訪問靜態(tài)字段:Car.count=Car.count+1;,28,類的構(gòu)造函數(shù),29,類的構(gòu)造函數(shù),30,類的構(gòu)造函數(shù),類的構(gòu)造函數(shù): 執(zhí)行類和對象的初始化工作的方法。,31,類的構(gòu)造函數(shù)的重載,構(gòu)造函數(shù)是不返回值的。,32,構(gòu)造函數(shù)的調(diào)用,構(gòu)造函數(shù)是在產(chǎn)生一個類實例的時候,通過new來調(diào)用。,33,靜態(tài)構(gòu)造函數(shù)(static constructor),典型作用:當類使用日志文件時, 使用靜態(tài)構(gòu)造函數(shù)向日志文件寫入項。,靜態(tài)構(gòu)造函數(shù)沒有訪問級別修飾符,也沒有
8、參數(shù)。,34,靜態(tài)構(gòu)造函數(shù),當類被加載時,類的靜態(tài)構(gòu)造器會被自動調(diào)用。 靜態(tài)構(gòu)造器是在類的靜態(tài)成員被使用之前執(zhí)行的。,35,靜態(tài)構(gòu)造函數(shù),當有:A a=new A(); 先執(zhí)行類A的靜態(tài)構(gòu)造器,然后執(zhí)行類A的實例構(gòu)造器。 當再有:A a1=new A(); 靜態(tài)構(gòu)造器最多只執(zhí)行一次。,36,靜態(tài)構(gòu)造函數(shù),37,語法形式: 屬性集信息 extern 標識符 ( ) 析構(gòu)函數(shù)體 其中: 標識符必須與類名相同,但為了區(qū)分構(gòu)造函數(shù),前面需加“”,表明它是析構(gòu)函數(shù)。關(guān)于析構(gòu)函數(shù),請注意: 析構(gòu)函數(shù)不能由程序顯式地調(diào)用,而是由系統(tǒng)在釋放對象時自動調(diào)用。 如果對象是一個派生類對象,那么在調(diào)用析構(gòu)函數(shù)時也會產(chǎn)
9、生鏈式反應,首先執(zhí)行派生類的析構(gòu)函數(shù),然后執(zhí)行基類的析構(gòu)函數(shù),如果這個基類還有自己的基類,這個過程就會不斷重復,直到調(diào)用Object類的析構(gòu)函數(shù)為止,其執(zhí)行順序正好與構(gòu)造函數(shù)相反。 析構(gòu)函數(shù)不能寫返回類型,也不能帶參數(shù),因此它不可能被重載,當然它也不能被繼承,所以一個類最多只能有一個析構(gòu)函數(shù)。,析構(gòu)函數(shù),38,析構(gòu)函數(shù),關(guān)于析構(gòu)函數(shù),請注意: 析構(gòu)函數(shù)不能由程序顯式地調(diào)用,而是由系統(tǒng)在釋放對象時自動調(diào)用。 如果對象是一個派生類對象,那么在調(diào)用析構(gòu)函數(shù)時也會產(chǎn)生鏈式反應,首先執(zhí)行派生類的析構(gòu)函數(shù),然后執(zhí)行基類的析構(gòu)函數(shù),如果這個基類還有自己的基類,這個過程就會不斷重復,直到調(diào)用Object類的析
10、構(gòu)函數(shù)為止,其執(zhí)行順序正好與構(gòu)造函數(shù)相反。,39,垃圾回收和析構(gòu)函數(shù),析構(gòu)函數(shù): 1、由C#中的垃圾回收器調(diào)用,垃圾回收器通過銷毀不再需要或不再被引用的對象來釋放內(nèi)存。 2、無任何參數(shù),也不返回值,函數(shù)名與類名相同,以開頭。 3、析構(gòu)函數(shù)是自動被調(diào)用的,當任何代碼都不再可能使用一個實例時,當程序退出時,都會調(diào)用析構(gòu)函數(shù)。 4、只應該用來清理非托管資源,垃圾回收器會自動清理托管資源。 5、析構(gòu)函數(shù)可以包含恰在對象銷毀前需要執(zhí)行的代碼(如關(guān)閉文件、保存狀態(tài)信息等)。 6、析構(gòu)函數(shù)實際上是對System.Object的虛方法Finalize的重寫,c#不允許重寫此方法或直接調(diào)用它(或它的重寫)。,4
11、0,垃圾回收器,垃圾回收器的工作原理: 如果為定義析構(gòu)函數(shù)的對象分配了內(nèi)存,運行庫將把該對象添加到需要銷毀的對象的列表中。 垃圾回收器定期檢查有沒有不再被引用的對象, 如果找到了其名稱沒有列在銷毀器列表中的對象,就立即清除該對象。 完成垃圾回收后,將調(diào)用銷毀器線程,該線程調(diào)用有標記為“準備銷毀”的對象的銷毀方法(析構(gòu)函數(shù))。 對象銷毀過程發(fā)生后,就將該對象從需要銷毀的對象列表中刪除。 因為該對象沒有被引用,也沒有列在銷毀器列表中,所以下次進行垃圾回收時就會將它清除。,41,析構(gòu)函數(shù),public class Person string name; public Person(string my
12、name) name = myname; public string Name get return name; set name = value; Person() StreamWriter sr = new StreamWriter(d:人員信息.txt, true); sr.WriteLine(this.Name); sr.Close(); ,42,析構(gòu)函數(shù),1、當不再需要某對象時,CLR調(diào)用該對象的析構(gòu)函數(shù),然 后釋放其內(nèi)存,析構(gòu)函數(shù)執(zhí)行清理任務,如保存狀態(tài)信息、關(guān) 閉文件和數(shù)據(jù)庫的連接,以及執(zhí)行在釋放對象前必須完成的其 它任務。 2、調(diào)用析構(gòu)函數(shù)的時間是不確定的,在對象喪失范圍和系統(tǒng)
13、 自動調(diào)用析構(gòu)函數(shù)之間通常會有延遲。 3、應用程序終止之前一定會調(diào)用析構(gòu)函數(shù)。 4、基類的析構(gòu)函數(shù)是不能被繼承的,若派生類需要析構(gòu)函數(shù),必須在派生類中聲明它。 5、析構(gòu)函數(shù)首先從最相近派生的類開始運行,最后執(zhí)行基類中的代碼。,43,析構(gòu)函數(shù),class Employee:Person string id; public Employee (string name ,string id):base(name ) this .ID=id ; public string ID get return id ; set id =value ; Employee () SaveStateInfo1();
14、protected void SaveStateInfo1() StreamWriter sr; sr = new StreamWriter(D: 人員信息.txt , true); sr.WriteLine(this.ID); sr.Close(); ,Employee e1 = new Employee(Tom, 010203);,44,創(chuàng)建程序集,程序集是任何 .NET Framework 應用程序的基本構(gòu)造塊。 例如,在生成簡單的 C# 應用程序時,Visual Studio 創(chuàng)建一個 單個可移植可執(zhí)行 (PE) 文件形式的程序集,明確地說就是一個 EXE 或 DLL。,1、創(chuàng)建具有
15、.exe 擴展名的程序集并指定輸出文件名 從名為 myCode 的代碼模塊創(chuàng)建名為 myAssembly.exe 的 程序集 csc /out:myAssembly.exe myCode.cs,2、創(chuàng)建庫程序集 庫程序集與類庫相似。它包含將由其他程序集引用的類型,但沒有開始執(zhí)行的入口點。 csc /out:myCodeLibrary.dll /t:library myCode.cs 從名為 myCode 的代碼模塊創(chuàng)建名為 myCodeAssembly.dll 的庫程序集。,45,46,類的方法,47,類的方法,48,類的方法,方法: 描述一個對象的動作。,調(diào)用方法: Car car1=new
16、 Car(); car1.Run();,49,方法的訪問修飾符,50,方法的返回值,如果說參數(shù)是方法的”輸入“, 那么返回值就是方法的”輸出“。,Console.WriteLine(car1的重量是 + car1.GetWeight() + 噸);,51,52,方法的參數(shù)傳遞類型,53,值傳遞、引用傳遞和ref參數(shù),參數(shù)傳遞: 1、值傳遞:實參將值拷貝給形參,系統(tǒng)要為形參開設存儲空間,以接受傳遞的值,此時形參成為一個實在的局部變量,從此實參和形參脫離關(guān)系,形參在方法中參與運算,在運算中的發(fā)生的任何變化都不會影響實參; 2、引用傳遞:實參將自己的引用,也就是自己數(shù)據(jù)在存儲器中的地址拷貝給形參,這
17、時形參如同實參的別名,系統(tǒng)不必為形參開設存儲空間,形參在方法中的任何改變就是實參的改變,所以引用參數(shù)既是方法的輸入,又是方法的輸出,引用傳遞的形參需要用ref關(guān)鍵字聲明,調(diào)用方法時的實參也要添加ref關(guān)鍵字。 3、對于屬性、事x件、索引器和用戶定義的運算符來說,它們的參數(shù)總是作為值參數(shù)傳遞的。這些成員類別不支持引用參數(shù)和輸出參數(shù)(out)。,54,值傳遞、引用傳遞和ref參數(shù),C#的數(shù)據(jù)類型有值類型和引用類型兩種,所以參數(shù)傳遞時,在形式上有四種情況: 1、值類型參數(shù)進行值傳遞 2、引用類型參數(shù)進行值傳遞 3、值類型參數(shù)進行引用傳遞 4、引用類型參數(shù)進行引用傳遞,55,out參數(shù),一般情況下,一
18、個方法只有一個返回值,返回數(shù)據(jù)是一種輸出的方式,ref修飾的參數(shù),或者是引用類型參數(shù),它們既是輸入,又是輸出,out參數(shù)提供了更靈活的輸出方式。 out參數(shù)也稱為輸出參數(shù)。和ref參數(shù)類似,用out修飾的參數(shù),直接將引用傳遞給方法,不在存儲器中為參數(shù)開設新的空間,但是,和ref參數(shù)不一樣,調(diào)用方法前并不需要對參數(shù)作初始化,正因為如此,在out參數(shù)沒有被顯式賦值之前,不能使用,在方法結(jié)束前應該對out參數(shù)賦值。 調(diào)用方法時,也要用out修飾實參,并且實參必須是變量,不能是屬性、表達式。 out參數(shù)可以用在實例方法、靜態(tài)方法和實例構(gòu)造函數(shù)中,不能用在屬性和索引器中。,56,向方法傳遞可變數(shù)量的參數(shù)
19、,57,params參數(shù),一般情況下,方法的輸入是通過參數(shù)列表規(guī)定的,輸入?yún)?shù)的個數(shù)不能隨著實際調(diào)用的需要而改變,params參數(shù)則提供了這樣一種方便,例如,有n組數(shù)據(jù),每一組數(shù)據(jù)個數(shù)都不一樣,但都要求平均數(shù),在C#中,借助params參數(shù),只要定義一個方法就可以完成這樣的靈活功能。 params參數(shù)也稱為參數(shù)數(shù)組。params參數(shù)是具有一維數(shù)組性質(zhì)的數(shù)組類型的參數(shù),例如一維數(shù)組,或者交錯數(shù)組,但不能是多維數(shù)組; params參數(shù)實際上是不定長的數(shù)組,定義形參時要使用params關(guān)鍵字,不需要指定長度,在調(diào)用時,實參不需要用params關(guān)鍵字,實參可以是任意個數(shù)的元素,也可以是一個同類型的數(shù)組
20、。 params參數(shù)只能作為參數(shù)列表的最后一個參數(shù)。 params參數(shù)不能再用ref或out修飾。,58,值參數(shù)的傳遞,59,引用參數(shù)的傳遞,60,輸出參數(shù)的傳遞,61,輸出參數(shù)和引用參數(shù)的區(qū)別,62,方法的參數(shù),參數(shù)的傳入或傳出就是在實參與形參之間發(fā)生的, 在C#中實參與形參有4種傳遞方式。 1值參數(shù) 在方法聲明時不加修飾的形參就是值參數(shù),它表明實參與形參之間按值傳遞。這種傳遞方式的好處是,在方法中對形參的修改不影響外部的實參,也就是說,數(shù)據(jù)只能傳入方法而不能從方法傳出,所以值參數(shù)有時也被稱為入?yún)?shù)。,63,using System; class Myclass public void So
21、rt (int x, int y, int z) int tmp; / tmp是方法Sort的局部變量 / 將x, y, z按從小到大排序 if (xy) tmp=x; x=y; y=tmp; if (xz) tmp=x; x=z; z=tmp; if (yz) tmp=y; y=z; z=tmp; ,class Test static void Main() Myclass m = new Myclass ( ); int a, b, c; a=30; b=20; c=10; m.Sort (a, b, c); Console.WriteLine (a=0, b=1, c=2 , a, b,
22、 c ); Console.Read (); ,【例3.7】 下面的程序演示了當方法Sort傳遞的是值參數(shù)時,對形參的修改不影響其實參。,方法的參數(shù),64,方法的參數(shù),a、b、c 變量的值并沒有發(fā)生改變,因為它們都是按值傳給形參x、y、z的,形參x、y、z的變化并不影響外部a、b、c的值。 但如果給方法傳遞的是一個引用對象時,它遵循的仍是值參數(shù)傳遞方式,形參另外分配一塊內(nèi)存,接受實參的引用值副本,同樣對引用值的修改不會影響外面的實參。但是,如果改變參數(shù)所引用的對象將會影響實參所引用的對象,事實上,它們是同一塊內(nèi)存區(qū)域。,65,【例3.8】 下面程序演示的是當方法傳遞的是一個引用對象(如數(shù)組)時
23、,對形參的修改會影響到實參。,方法的參數(shù),using System; class Myclass public void SortArray (int a) int i, j, pos,tmp; for (i=0; ia j) pos=j; if (pos != i ) tmp=ai; ai=apos; apos=tmp; ,66,方法的參數(shù),class Test static void Main() Myclass m = new Myclass ( ); int score = 87,89,56,90,100,75,64,45, 80, 84 ; m.SortArray(score); f
24、or ( int i=0; iscore.Length; i+) Console.Write (score0=1, , i , scorei ); if (i=4) Console.WriteLine (); Console.Read (); ,67,方法的參數(shù),2. 引用參數(shù) 如果調(diào)用一個方法,期望能夠?qū)鬟f給它的實際變量進行 操作,如下面例3.9中Sort方法對x、y、z 的排序希望對調(diào) 用這個方法的實際變量a、b、c產(chǎn)生作用,如前所見,用C# 默認的按值傳遞是不可能實現(xiàn)的。所以C#用ref修飾符來解 決此類問題,它告訴編譯器,實參與形參的傳遞方式是引用。 引用與值參數(shù)不同,引用參數(shù)并不創(chuàng)
25、建新的存儲單元,它 與方法調(diào)用中的實在參數(shù)變量同處一個存儲單元。因此,在方 法內(nèi)對形參的修改就是對外部實參變量的修改。,68,【例3.9】 將例3.7程序中Sort方法的值參數(shù)傳遞方式改成引用參數(shù)傳遞,這樣在方法Sort中對參數(shù)x、y、z按從小到大的排序影響了調(diào)用它的實參a、b、c。,方法的參數(shù),using System; class Myclass public void Sort (ref int x, ref int y, ref int z) int tmp; / tmp是方法Sort的局部變量 / 將x, y, z按從小到大排序 if (xy) tmp=x; x=y; y=tmp;
26、if (xz) tmp=x; x=z; z=tmp; if (yz) tmp=y; y=z; z=tmp; ,69,方法的參數(shù),class Test static void Main() Myclass m = new Myclass ( ); int a, b, c; a=30; b=20; c=10; m.Sort (ref a, ref b, ref c); Console.WriteLine (a=0, b=1, c=2 , a, b, c ); Console.Read(); ,70,方法的參數(shù),使用ref時請注意: (1)ref關(guān)鍵字僅對跟在它后面的參數(shù)有效,而不能應用于整個參數(shù)表
27、。例如,Sort方法中x、y、z都要加ref修飾。 (2)在調(diào)用方法時,也用ref修飾實參變量,因為是引用參數(shù),所以要求實參與形參的數(shù)據(jù)類型必須完全匹配,而且實參必須是變量,不能是常量或表達式。 (3)在方法外,ref參數(shù)必須在調(diào)用之前明確賦值,在方法內(nèi),ref參數(shù)被視為已賦過初始值。,71,方法的參數(shù),3. 輸出參數(shù) 在參數(shù)前加out修飾符的被稱為輸出參數(shù),它與ref參數(shù)相似,只有一點除外,就是它只能用于從方法中傳出值,而不能從方法調(diào)用處接受實參數(shù)據(jù)。在方法內(nèi)out參數(shù)被認為是未賦過值的,所以在方法結(jié)束之前應該對out參數(shù)賦值。,72,【例3.10】 求一個數(shù)組中元素的最大值、最小值和平均值
28、。,方法的參數(shù),using System; class Myclass public void MaxMinArray (int a, out int max, out int min, out double avg ) int sum ; sum = max = min = a0 ; for (int i=1; imax) max=ai; if (aimin) min=ai; sum+=ai; avg=sum / a.Length; ,73,方法的參數(shù),class Test static void Main() Myclass m = new Myclass ( ); int score =
29、 87,89,56,90,100,75,64,45, 80, 84 ; int smax, smin; double savg; m.MaxMinArray(score, out smax, out smin, out savg); Console.Write (Max=0, Min=1, Avg=2 , smax, smin, savg ); Console.Read (); ,74,方法的參數(shù),ref和out參數(shù)的使用并不局限于值類型參數(shù),它們也可用 于引用類型來傳遞對象。 【例3.11】 下面程序定義了兩個方法,一個是Swap1,一 個是Swap2,它們都有兩個引用對象作為參數(shù),但Swa
30、p2 的參數(shù)加了ref修飾,調(diào)用這兩個方法產(chǎn)生的結(jié)果是不一樣的。,75,方法的參數(shù),using System; class Myclass public void Swap1 (string s, string t) string tmp; tmp=s; s=t; t=tmp; public void Swap2 (ref string s, ref string t) string tmp; tmp=s; s=t; t=tmp; class Test static void Main() ,76,方法的參數(shù),Myclass m = new Myclass ( ); string s1=ABC
31、DEFG, s2=134567; m.Swap1(s1,s2); Console.WriteLine (s1=0 , s1 ); / s1,s2的引用并沒有改變 Console.WriteLine (s2=0 , s2 ); m.Swap2(ref s1, ref s2); / s1,s2的引用互相交換了 Console.WriteLine (s1=0 , s1 ); Console.WriteLine (s2=0 , s2 ); Console.Read (); ,77,方法的參數(shù),4參數(shù)數(shù)組 一般而言,調(diào)用方法時其實參必須與該方法聲明的形參在類型和數(shù)量上相匹配,但有時候我們更希望靈活一些,
32、C#提供了傳遞可變長度參數(shù)表的機制,使用params關(guān)鍵字來指定一個可變長的參數(shù)表。 【例3.12】 下面程序演示了Myclass類中的方法MaxMin 有一個參數(shù)數(shù)組類型的參數(shù),在調(diào)用這個方法時具有靈活性。,78,方法的參數(shù),using System; class Myclass public void MaxMin (out int max, out int min, params int a ) if (a.Length=0) / 如果可變參數(shù)為零個,可以取一個約定值或產(chǎn)生異常 max=min=1; return ; max = min = a0 ; for (int i=1; imax
33、) max=ai; if (aimin) min=ai; ,79,方法的參數(shù),class Test static void Main() Myclass m = new Myclass ( ); int score = 87,89,56,90,100,75,64,45, 80, 84 ; int smax, smin; m.MaxMin (out smax, out smin);/ 可變參數(shù)的個數(shù)可以是零個 Console.WriteLine (Max=0, Min=1 , smax, smin ); m.MaxMin (out smax, out smin, 45, 76, 89, 90 )
34、; / 在4個數(shù)之間找最大、最小 Console.WriteLine (Max=0, Min=1 , smax, smin ); m.MaxMin (out smax, out smin, score); / 可變參數(shù)也可接受數(shù)組對象 Console.WriteLine (Max=0, Min=1 , smax, smin ); Console.Read (); ,80,C#的優(yōu)勢,作為編程語言,C#是現(xiàn)代的、簡單的、完全面向?qū)ο蟮?,而且是類型安全的。重要的是,C#是一種現(xiàn)代編程語言。在類、名字空間、方法重載和異常處理等方面,C#去掉了C+中的許多復雜性,借鑒和修改了Java的許多特性,使其更
35、加易于使用,不易出錯。 下面列舉了一些C#在設計上的優(yōu)點:,81,方法的參數(shù),【例3.12】 下面程序演示了Myclass類中的方法MaxMin有一個參數(shù)數(shù)組類型的參數(shù),在調(diào)用這個方法時具有靈活性。,82,方法的參數(shù),using System; class Myclass public void MaxMin (out int max, out int min, params int a ) if (a.Length=0) / 如果可變參數(shù)為零個,可以取一個約定值或產(chǎn)生異常 max=min=1; return ; max = min = a0 ; for (int i=1; imax) max
36、=ai; if (aimin) min=ai; ,83,方法的參數(shù),class Test static void Main() Myclass m = new Myclass ( ); int score = 87,89,56,90,100,75,64,45, 80, 84 ; int smax, smin; m.MaxMin (out smax, out smin); / 可變參數(shù)的個數(shù)可以是零個 Console.WriteLine (Max=0, Min=1 , smax, smin ); m.MaxMin (out smax, out smin, 45, 76, 89, 90 ); /
37、在4個數(shù)之間找最大、最小 Console.WriteLine (Max=0, Min=1 , smax, smin ); m.MaxMin (out smax, out smin, score); / 可變參數(shù)也可接受數(shù)組對象 Console.WriteLine (Max=0, Min=1 , smax, smin ); Console.Read (); ,84,cashRegister Candy = new cashRegister (200, 1); cashRegister Chips = new cashRegister (500,3.5); Candy.makeSale (5);
38、Console.Write (Candy.numItems=0 , CductCount (); / 調(diào)用實例方法與對象Candy相關(guān)聯(lián) Console.WriteLine (cashSum=0 , cashRductCost() ); / 調(diào)用靜態(tài)方法與類cashRegister相關(guān)聯(lián) Chips.makeSale (10); Console.Write (Chips.numItems=0 , CductCount() ); / 調(diào)用實例方法與對象Chips相關(guān)聯(lián) Console.WriteLine (cashSum=0 , cashRe
39、ductCost() ); / cashSum計Candy和Chips售出總價 Console.Read (); ,方法的參數(shù),85,方法的參數(shù),在上面的程序中可以看到,實例方法makeSale() 中可以使用this來引用變量numItems。 這里this關(guān)鍵字表示引用當前對象實例的成員。在實例方 法體內(nèi)也可以省略this,直接引用numItems,實際上兩者 的語義相同。而靜態(tài)方法不與對象關(guān)聯(lián),理所當然地不能用 this指針。this關(guān)鍵字一般用于實例構(gòu)造函數(shù)、實例方法和 實例訪問器,以訪問對象實例的成員。,86,87,實例方法和靜態(tài)方法,一個類的方法代碼只有一份,它
40、們的生命期和類是一致的,所謂的實例方法是指通過對象名調(diào)用的方法,靜態(tài)方法與類關(guān)聯(lián),而不是與對象關(guān)聯(lián),定義靜態(tài)方法時要使用static關(guān)鍵字,調(diào)用靜態(tài)方法時要使用類名,而不是對象名。靜態(tài)方法不能直接訪問非靜態(tài)的字段,靜態(tài)字段可以被所有方法所訪問。 方法由方法頭和方法體兩部分組成,定義格式如下: 修飾符 返回類型 方法名 (參數(shù)列表) 方法體 定義靜態(tài)方法的格式為: 修飾符 static 返回類型 方法名 (參數(shù)列表) 方法體,88,Main方法,Main方法是C#程序的入口,必須定義在某一個類中,通常定義一個專門管理Main方法的類,雖然原則上也可以把Main方法定義在其它類中,并且不影響編譯時
41、的程序邏輯。作為程序入口的Main方法,必須是public和static的。 Main方法常使用以下兩種形式: public static void Main() public static void Main(string args) 第二種形式種的參數(shù),稱為命令行參數(shù),命令行參數(shù)是一個字符串數(shù)組,使用命令行參數(shù)可以增加運行程序的靈活性。,89,靜態(tài)方法,使用方法:類名.靜態(tài)方法名 不管類生成對象與否,類的靜態(tài)方法都可以被使用,實例方法則在類創(chuàng)建對象后,才能被使用: 對象名.實例方法名 可以使用該方法所在類的所有靜態(tài)成員和實例成員,90,using System; public class
42、UseMethod private static int x=0; /靜態(tài)字段 private int y=1; /實例字段 public static void StaticMethod() /靜態(tài)方法 x=10; /正確,靜態(tài)方法訪問靜態(tài)數(shù)據(jù)成員 y=20; /錯誤,靜態(tài)方法不能訪問實例數(shù)據(jù)成員 public void NoStaticMethod() /實例方法 x=10;/正確,實例方法訪問靜態(tài)數(shù)據(jù)成員 y=20;/正確,實例方法訪問實例數(shù)據(jù)成員 ,靜態(tài)方法與實例方法,91,public class Class1 public static void Main() UseMethod
43、m=new UseMethod(); /使用靜態(tài)方法格式為:類名.靜態(tài)方法名 UseMethod.StaticMethod(); /使用實例方法格式為:對象名.實例方法名 m.NoStaticMethod(); ,靜態(tài)方法與實例方法,92,93,方法的重載,C#中方法參數(shù)個數(shù)和類型的不同稱為方法的“簽名”。,方法的重載編寫名字相同而簽名不同的方法,94,方法的重載,C#根據(jù)參數(shù)類型,而不是參數(shù)名稱識別簽名。,非法重載,95,方法重載,car1.Run(); car1.Run(51號); car1.Run(100);,調(diào)用哪個版本最合適, 由編譯器處理。,96,97,類的屬性,98,屬性的引入,
44、網(wǎng)站新用戶注冊:,如果有zs.sex=“好“;會怎么樣呢?,使用zs.SetSex(“男”); 為性別賦值,99,屬性的引入,100,類的屬性簡介,class Employee private static string _name; private static string _id; static void Main(string args) _name = Console.ReadLine(); _id = Console.ReadLine(); ,直接訪問字段 不經(jīng)驗證,101,類的屬性簡介,class Employee private static string _name; pri
45、vate static string _id; public void SetId(value) / 驗證輸入長度小于 2 if (_id.Length 2) _id = value; public string GetId() return _id; ,方法 SetId(Value) 和 GetId() 分別讀取和寫入職員 ID, Employee emp; emp.SetId(A1); string Department = emp.Get() ,每次都調(diào)用 GetId() 和 SetId() 方法會很繁瑣,屬性,102,類的屬性簡介,class Employee private stat
46、ic string _name; private static string _id; public string Id get return _id; set / 驗證輸入長度小于 2 if (_id.Length 2) _id = value; ,讀取 ID 時調(diào)用,將值賦給 ID 時調(diào)用,103,類的屬性類型1,訪問修飾符 數(shù)據(jù)類型 屬性名 get ; set ; ,讀/寫屬性,可以賦值和檢索值,104,類的屬性類型2,訪問修飾符 數(shù)據(jù)類型 屬性名 get ; ,只讀屬性,只能檢索值,105,類的屬性類型3,訪問修飾符 數(shù)據(jù)類型 屬性名 set ; ,只寫屬性,只能賦值,106,類的屬性
47、類型4,訪問修飾符static 數(shù)據(jù)類型 屬性名 get; set; ,靜態(tài)屬性,應用于整個類而不是類的實例,只能訪問類的靜態(tài)成員,107,類的屬性,value關(guān)鍵字:表示對屬性進行寫操作時提供的參數(shù)。,get定義屬性的讀操作 set定義屬性的寫操作,108,屬性與字段,1、對于屬性,可以提供get方法以支持讀,set方法以支持寫,也可以不提供。,109,屬性與字段,2、屬性擁有一些方法的特征,可以達到直接讀寫字段無法達到的效果。,110,類的索引器,Console.WriteLine(car1的第一個輪子是:0, car10); / car1的第一個輪子是:左前輪,111,類的索引器,thi
48、s關(guān)鍵字表示這是一個索引器,索引參數(shù)可以是任意類型,Console.WriteLine(“car1的左前輪是第0個輪子, car1“右前輪”); / car1的左前輪是第0個輪子,112,索引器,訪問修飾符 數(shù)據(jù)類型 this數(shù)據(jù)類型 標識符 get; set; ,語法格式:,索引器是一種語法上的公用程序,它可以讓一個對象像數(shù)組一樣被索引; 索引器訪問被對象封裝的集合或數(shù)組元素的語法直觀易懂,它可以讓一個對象像數(shù)組一樣被索引。,113,索引器與屬性,114,屬性,引入:封裝的主要應用就是實現(xiàn)類字段的存取控制, 在一般情況下,我們將類的特征設置為私有字段,然 后通過getXXX(),setXXX
49、()的形式來獲取或設置 字段的值,public class Human public string name; public string getName() return name; public void setName(string name) = name; ,115,屬性,C#的實現(xiàn):為了簡化Get和Set操作,同時為了照顧VB和 Delphi程序員的編碼習慣,C#提出了屬性的概念,在寫法 上更加簡化 在get和set的大括號之間,可以添加多條語句 。,public class Human public string name; public string Nam
50、e get return name; set name = value; ,116,117,綜合應用實例,【例3.19】 學生成績管理程序。 根據(jù)學生選修的課程及課程學分和課程成績計算GPA,最 后按GPA的值對學生進行排序。 基本思路:本程序的學生總?cè)藬?shù)、課程名、課程學分可以由 控制臺輸入,為敘述簡單,假定每個學生所選修的課程相同。 Course類定義了課程名、課程學分字段域,并使用屬性公 開私有字段。另外,Course類還定義了Name屬性、構(gòu)造函 數(shù)。 Course類代碼如下:,118,學生成績管理程序,class Course string courseName; / 課程名 int
51、courseMark; / 課程學分 public Course() public Course(string Name, int Mark) courseName=Name; courseMark=Mark; public string Name / Name屬性,課程名可讀可寫 get return courseName; set courseName=value; ,119,學生成績管理程序,public int Mark / Mark屬性,課程學分可讀可寫 get return courseMark; set courseMark=value; ,120,學生成績管理程序,Studen
52、t類定義學生姓名、學號、選修課程數(shù)、Course 類、成績及GPA等字段,并使屬性公開(public)。假定選 修課程一樣,所以將課程數(shù)、Course類對象定義為static字 段,不需要每個學生都有這份數(shù)據(jù)副本。 Student類還定義了CourseNum靜態(tài)屬性、GPA屬性、 Name屬性,SetCourse方法,用于設置課程名,因為不需 要為每個學生設置,所以定義成靜態(tài)方法。AddData屬性給 每個學生加入姓名、學號、成績。ComputeGPA 方法計算 學生成績的GPA。stuSwap方法對兩個Student對象內(nèi)容 進行交換。 Student類的代碼如下:,121,學生成績管理程序
53、,class Student string stuName; / 學生姓名 string stuID; / 學生學號 static int numberOfCourse; / 加static修飾符表明這個域為所有學生類對象共享 static Course list ; / Course類對象數(shù)組,用于設置每門課程名、課程學分 int stuScore; / 每個學生對象要填寫的各課程成績 double stuGPA; / GPA值 public Student() / 當?shù)谝淮蝿?chuàng)建Student對象時,創(chuàng)建list對象數(shù)組,并初始化 list=new CoursenumberOfCourse;
54、 for (int i=0; inumberOfCourse;i+) listi=new Course(); stuScore=new intnumberOfCourse; ,122,/ 將CourseNum定義成靜態(tài)屬性是因為它只對靜態(tài)域進行操作 public static int CourseNum get return numberOfCourse; set numberOfCourse=value; public double GPA / GPA屬性是只讀屬性 get return stuGPA; public string Name / Name屬性可讀可寫 get return s
55、tuName; set stuName=value; ,學生成績管理程序,123,學生成績管理程序,/ 將SetCourse設為靜態(tài)方法,是因為它僅訪問靜態(tài)數(shù)據(jù)域 / 不需要創(chuàng)建Student類對象就可直接用Student類名調(diào)用 / 它的形參是一個參數(shù)數(shù)組,這樣調(diào)用時就可根據(jù)實際選修的課程數(shù)來設置 public static void SetCourse(params Course topic) for (int i=0; itopic.Length ; i+) listi.Name =topici.Name; listi.Mark =topici.Mark; / AddData方法將一個學
56、生的數(shù)據(jù)添加到學生類對象數(shù)組中 public void AddData(string name,string Id,int score) stuName=name; stuID=Id; for (int i=0;iscore.Length; i+) stuScorei=scorei; ,124,學生成績管理程序,public void ComputeGPA() / 根據(jù)課程的學分以及學生成績計算GPA int i; double sMark, sumMark=0, sumGP=0; for (i=0;i=95) sMark=4.5; else if (stuScorei=90) sMark=4
57、; else if (stuScorei=85) sMark=3.5;,125,else if (stuScorei=80) sMark=3; else if (stuScorei=75) sMark=2.5; else if (stuScorei=70) sMark=2; else if (stuScorei=65) sMark=1.5; else if (stuScorei=60) sMark=1; else sMark=0; sumGP+=listi.Mark*sMark; sumMark+=listi.Mark; stuGPA=sumGP/sumMark; / stuSwap方法提供兩
58、個Student類對象的交換操作,注意它們的形參被修飾為ref,學生成績管理程序,126,學生成績管理程序,public void stuSwap(ref Student stu1, ref Student stu2) string name,Id; int i; int score=new int Student.CourseNum; double gpa; name=stu1.Name; Id=stu1.stuID; gpa=stu1.GPA; for (i=0;iStudent.CourseNum;i+) scorei=stu1.stuScorei; stu1.stuName=stu2.stuName; stu1.stuID=stu2.stuID; stu1.stuGPA=stu2.stuGPA; for (i=0;iStudent.CourseNum;i+) stu1.stuScorei=stu2.stuScorei; stu2.stuName=name; stu2.stuID=Id; stu2.s
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度公積金貸款購房合同標準解讀3篇
- 二零二五版企業(yè)間借款合同范本9篇
- 二零二五年度防盜門安全認證及銷售合同2篇
- 二零二五年度車輛保險居間代理合同(含優(yōu)惠方案)3篇
- 二零二五版特色果樹種植基地承包經(jīng)營合同3篇
- 影視作品評價與獎項申報2025年度合同3篇
- 二零二五年綠色節(jié)能LED廣告租賃合同3篇
- 深圳市2025年度人才住房裝修補助購房合同3篇
- 二零二五版汽車抵押貸款車輛殘值評估合同3篇
- 二零二五年度金融產(chǎn)品發(fā)行與銷售合同3篇
- 軟件項目應急措施及方案
- 2025河北邯鄲經(jīng)開國控資產(chǎn)運營管理限公司招聘專業(yè)技術(shù)人才5名高頻重點提升(共500題)附帶答案詳解
- 2024年民法典知識競賽考試題庫及答案(共50題)
- 2025老年公寓合同管理制度
- 2024-2025學年人教版數(shù)學六年級上冊 期末綜合卷(含答案)
- 鈑金設備操作培訓
- 中考英語688高頻詞大綱詞頻表
- 九年級初三中考物理綜合復習測試卷3套(含答案)
- 移民推薦信4篇【精選】
- 管理制度評價表(填寫模板)
- 工地設計代表服務記錄
評論
0/150
提交評論