第二章 C#程序設計基礎.ppt_第1頁
第二章 C#程序設計基礎.ppt_第2頁
第二章 C#程序設計基礎.ppt_第3頁
第二章 C#程序設計基礎.ppt_第4頁
第二章 C#程序設計基礎.ppt_第5頁
已閱讀5頁,還剩97頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第二章 C#程序設計基礎,第二章 C#程序設計基礎,2.1 C#語法介紹 2.2 值類型 2.3 引用類型 2.4 異常處理 2.5 C#面向對象的編程 2.6 裝箱與拆箱 本章小結,2.1.1 C#程序的基本結構,一個C#程序可以由一個或多個文件組成。它的程序是階層式的結構。 C#程序的基本結構包括:命名空間聲明、類聲明、“Main()”方法聲明和語句。下面講解一個簡單實例。 例2.1 一個簡單實例,此程序只有一個可執(zhí)行語句,程序運行時在屏幕上輸出:C#語言的基本結構!,2.1.1 C#程序的基本結構,using System; / 使用System命名空間聲明 namespace MyNa

2、me1 / 聲明用戶命名空間MyName1 class Myclass / 聲明Myclass類 public static void Main() / 聲明Main方法,此處是程序的入口 Console.WriteLine(C#語言的基本結構!); /* 從此開始多行整塊注釋, 注釋內容將被編譯器忽略。 */ ,2.1.1 C#程序的基本結構,在C#的基本結構中: 類和方法以“”開始,以“”結束; 一個C#程序必須有唯一的Main()方法; 所有的語句都以分號“;”結束; 程序可以加注釋,有兩種方法:一種是“/”表示單行注釋,表示從該注釋符號開始到該行結束都是注釋;另一種是以“/*”開始,以

3、“*/”結束的多行注釋。,2.1.1 C#程序的基本結構,在控制平臺編譯和運行源程序,需要計算機必須安裝.NET Framework SDK。此案例中,調用了Console的WriteLine()方法在屏幕上輸出一行提示信息??梢允褂靡粋€文本編輯器編寫這段代碼,將它存為cjg.cs文件。 .NET Framework SDK內置了C#編譯器。打開“Visual Studio.NET 2003命令提示”命令窗口。轉到保存文件所在目錄,在命令行輸入: csc cjg.cs,編譯成功,就會得到可執(zhí)行文件cjg.exe。在命令行輸入執(zhí)行文件命令:cjg回車,就會顯示輸出結果:C#語言的基本結構!,2.

4、1.2 變量與常量,1. 變量 變量是指在程序運行過程中,其值可以發(fā)生變化的量,通常用來保存程序運行過程中的輸入數(shù)據(jù)、計算獲得的中間結果和最終結果。每個變量都有一種類型來確定什么樣的數(shù)據(jù)可以存儲在該變量中。 C#是一種的安全語言,編譯器會檢查變量和它所存儲的數(shù)據(jù)類型是否一致,C#中所有變量必須“先聲明后引用”,變量的聲明語句的一般形式為: 附加屬性 修飾符 類型名 變量聲明符列表;,2.1.2 變量與常量,說明: 1)附加屬性:附加聲明信息; 2)修飾符:允許的修飾符有new和pulic protected internal private 有效組合; 3)變量聲明符:變量名表示符,變量名必須

5、是合法的標示符。 4)變量聲明符列表:以逗號分隔的若干個變量聲明符; 在聲明變量時可以用變量初始化設定項給它賦初始值,也可以在聲明時不初始化。C#的編譯器要對所有的變量作用明確賦值檢查,如果檢查出未初始化的某變量,在使用變量之前必須對它賦值,如果不賦值,編譯器會發(fā)出錯誤警告。,2.1.2 變量與常量,C#語言中共有七種變量:靜態(tài)變量、非靜態(tài)變量、數(shù)組元素、值參數(shù)、引用參數(shù)、輸出參數(shù)和局部變量。 1)靜態(tài)變量 在類中使用static修飾符聲明的字段成為靜態(tài)變量,靜態(tài)變量與所屬的類生命期相同。靜態(tài)變量被視為初始已賦值 ,初始值是變量類型默認值。 2)非靜態(tài)變量 沒有使用static修飾符聲明的變量

6、。 在類中直接聲明的不帶static修飾符聲明的變量成為非靜態(tài)變量。 在結構中聲明的不帶static修飾符的變量也是非靜態(tài)變量。,2.1.2 變量與常量,3)數(shù)組元素 數(shù)組的一個元素當一個數(shù)組實例產(chǎn)生時存在,當沒有對數(shù)組實例進行引用時消失。數(shù)組元屬被視為初始已賦值,數(shù)組元素的初始值是該變量類型默認值。 4)值參數(shù) 沒有用ref或out限定符聲明的參數(shù)叫值參數(shù)。當調用該值參數(shù)所屬的成員函數(shù)時,才產(chǎn)生該值參數(shù),調用完畢后,值參數(shù)消失。 5)引用參數(shù) 一個用ref限定符聲明的參數(shù)叫引用參數(shù),一個引用參數(shù)不產(chǎn)生新的存儲地址,相反,它表示的存儲地址與函數(shù)成員調用中的變量相同,因此,引用變量的值與所傳遞的

7、變量相同。,2.1.2 變量與常量,6)輸出參數(shù) 用out限定符聲明的變量叫輸出參數(shù)。輸出參數(shù)不產(chǎn)生一個新的存儲地址,相反,它表示的存儲地址與函數(shù)成員調用中的變量相同,因此輸出參數(shù)的值與所傳遞的變量相同。 7)局部變量 局部變量是通過局部變量聲明語句定義的,該聲明可以出現(xiàn)在塊、for語句、foreach語句、switch語句或using語句中。一個局部變量不會自動被初始化,因此沒有默認值,為了對明確地賦值進行校驗,一個局部變量被認為是初始未被賦值過。如果局部變量聲明包括變量初始值設定項,則該局部變量被視為在它的整個有效范圍內已明確賦值。在局部變量聲明語句之前引用該局部變量將會導致編譯時錯誤。,

8、2.1.2 變量與常量,2. 常量 常量是用來表示常數(shù)的類成員,它有一個名稱標識符。一個常量在使用之前必須用常量聲明語句來明確它的類型和值。常量聲明語句的形式: 附加屬性 修飾符 const 常量類型名 聲明式列表; 說明: 附加屬性:附加聲明信息。 修飾符:允許的修飾符有 new、pulic、protected、internal和private的有效組合。 常數(shù)類型名:byte、char、short、int、long、float、double、decimal、bool、string。 聲明式列表:以逗號分隔的聲明式列表。 聲明式:常量名=常量表達式,2.1.2 變量與常量,一條聲明多個常量的

9、常量聲明與聲明單個常量的多個聲明,當它們有相同的附加屬性、修飾符和類型時相互等價。例如: class A public const double X=1.0 , Y=2.0 , Z=3.0; 等同于 class A public const double X=1.0; public const double Y=2.0; public const double Z=3.0; ,2.1.3 表達式,表達式是由操作符(運算符)和操作數(shù)組成的一組有序的計算式。操作符表示對于操作數(shù)進行運算。 表達式的分類: 表達式按操作符分類,通常由算術操作符、位操作符構成算術表達式;由操作運算符構成賦值表達式;由關

10、系操作符構成關系表達式;由邏輯操作符構成邏輯表達式;由特殊操作符構成的表達式可以按其最終結果類型分類。 一個表達式可以由以下元素組成:值、變量、命名空間、類型、方法、屬性存取、事件存取、索引存取等多種元素。,2.1.4 C#操作符,運算就是對數(shù)據(jù)或變量進行加工處理的過程。描述各種不同運算的符號稱為操作符或運算符。C#提供了豐富的操作符,見書中表2.1。,2.1.4 C#操作符,按所操作對象的數(shù)目劃分,操作符可分為三類。 一元(單目)操作符 帶有一個運算對象并用到前綴表達式或后綴表達式。例如:X , X+ 二元操作符 帶有二個運算對象并用到前綴表達式或后綴表達式。例如:X+Y,X-Y,X/5 三

11、元操作符 只有一種三元操作符“?”,稱為三元條件運算符。三元操作符帶有3個運算對象,運算符中的兩個符號插在三個操作數(shù)中間。例如:表達式(y 7 ? a : b),其中“?”代表一個判斷, “:”則將判斷后的兩種取值分開,此例表示如果y8為真則取a的值,否則取b的值。,2.1.5 C#控制語句,C#直接借用C和C+的大部分語句,并對之作了一些改動和調整。C#的語句包括:基本語句、標記語句、聲明語句、選擇語句、迭代語句。下面介紹幾種常見語句:,2.1.5 C#控制語句,1. if語句 if語句用于在程序中有條件地執(zhí)行一段代碼,語法形式如下: if (expression ) statement;

12、/當expression為真時執(zhí)行statement語句序列 . 說明:表達式值為“真”,執(zhí)行statement語句內容。 注意:表達式必須用圓括號括起來。,2.1.5 C#控制語句,2. if-else語句 if-else語句用于程序根據(jù)一個特定表達式的值執(zhí)行兩種單獨的動作。語法形式如下: if (expression ) statement1; /當expression為真時執(zhí)行statement1語句序列 . else statement2; /當expression為真時執(zhí)行statement1語句序列 . ,2.1.5 C#控制語句,3. switch語句 switch語句是多選擇控

13、制語句,根據(jù)與指定的表達式相關的值來執(zhí)行不同的語句,如果沒有與之匹配的值,執(zhí)行一個默認語句。 switch語句通過將控制傳遞給其體內的某個case子句來處理多個選擇。其語法形式如下: switch (表達式) case 標號:內嵌語句列表; default :內嵌語句列表;,2.1.5 C#控制語句,switch語句的功能是:將控制轉到與“表達式”值匹配的“常量表達式”所對應的case子句。switch語句可包含任意數(shù)量的case子句,但同一switch語句中的兩個case子句的“常量表達式”不能具有相同的值。如果“表達式”的值與任何“常量表達式”都不匹配,則控制轉到default標號后面的內

14、嵌語句列表。如果沒有default標號,則控制傳遞到switch之后的下一條語句。,2.1.5 C#控制語句,例2.2 根據(jù)輸入的字符分不同情況輸出對應的字符串 using System; class SwitchTest public static void Main() Console.WriteLine(Size:1=Small 2=Medium 3=Large); Console.Write(Please enter your selection:); string s=Console.ReadLine();,2.1.5 C#控制語句,switch(s) case 0:goto cas

15、e 1; case 1:Console.WriteLine(Small size.);break; case 2:Console.WriteLine(Medium size.);break; case 3:Console.WriteLine(Large size.);break; default:Console.WriteLine(Invalid selection.);break; Console.WriteLine(Thanke you for your business.); ,2.1.5 C#控制語句,運行輸出結果: Size: 1= Small 2=Medium 3=Large Pl

16、ease enter you selection: 輸入選擇:1、2或3 Please enter you selection:2 回車 Medium size Tank you for your business.,2.1.5 C#控制語句,4. while語句 while語句是一種“預測試”的循環(huán)。是當型循環(huán)語句,它的形式為: while (expression) statement; ,2.1.5 C#控制語句,5. do-while語句 do-while語句是一種“后測試”的循環(huán)。在循環(huán)體中先執(zhí)行一次再判斷表達式的值,所以do-while循環(huán)語句總能保證循環(huán)體被執(zhí)行一次。它是直到型循環(huán)

17、。它的形式為: do statement; . while (expression);,2.1.5 C#控制語句,6. for語句 for語句首先計算初始化表達式,當判斷條件成立時,反復執(zhí)行循環(huán)體,并重新計算循環(huán)判斷表達式。是一種計數(shù)的循環(huán)。它的形式為: for(expression1;expreeion2;expression3) statement; . ,2.1.5 C#控制語句,例2.3 for循環(huán)實例 using System; class Test static void Main() for(int i=0;i3;i+) Console.WriteLine(i); 運行輸出結果:

18、 0 1 2,2.1.5 C#控制語句,7. foreach語句 foreach語句是C#特有的一種循環(huán),foreach語句枚舉集合中的每一個元素,并為集合中的每個執(zhí)行一次語句。它的形式為: foreach( type identifier in expression ) embedded-statement,2.1.5 C#控制語句,說明: type:類型名,指定其后變量類型名。 identifier:變量名,表示集合或數(shù)組元素的迭代變量名。 expression:表達式,對象集合或數(shù)組表達式。其元素的類型必須可以轉換為類型名所指定的類型。 embedded-statement:循環(huán)體,要執(zhí)

19、行的嵌入語句或語句塊。 Foreach語句為數(shù)組或集合中的每個元素執(zhí)行一遍循環(huán)體,循環(huán)體中用指定的變量代表集合元素或數(shù)組元素。,返回,2.2 值類型,C#是個強類型的安全語言,編譯器要對所有變量的數(shù)據(jù)類型作嚴格的檢查,保證存儲在變量中的每個數(shù)值與變量類型一致。 C#的數(shù)據(jù)類型分為兩大類:值類型(value-type)和引用類型(reference-type) 1)值類型包括簡單類型、枚舉類型和結構類型 2)引用類型包括類類型、接口類型、數(shù)組類型、委托類型 C#語言的數(shù)據(jù)類型是統(tǒng)一的,所以任何類型的值都可以被當作對象,C#語言的任何類型都是直接或間接地從object類型派生來的,object是所

20、有類型的基類型。,2.2 值類型,值類型包括簡單類型、結構類型和枚舉類型。還可以進一步細分:,2.2.1 整型,C#語言中共有九種整型: sbyte、byte、short、ushort、char、int、uint、long、ulong。這九種整數(shù)所占存儲單元和表示數(shù)的范圍(取值范圍)各不相同。,2.2.2 布爾類型,布爾類型表示邏輯量,可能的值是true和false。在C+語言中,布爾類型的值可轉換為int類型的值;false等效于零值,而true等效非零值。在C#中為了增加安全性這種方法已經(jīng)被廢棄,用整數(shù)值表示邏輯值是非法的。C#只能用true和false表示邏輯運算中的“真”和“假”,不能

21、進行布爾類型與其它類型之間的相互轉換。,2.2.3 浮點型,C#支持兩種浮點類型:float和double,它們分別是32位的單精度浮點數(shù)和64位的雙精度浮點數(shù)。 類型位精度范圍(絕對值)Float327位1.510-453.41038double641516位5.010-3241.710308如果一個二元操作符的運算數(shù)是浮點型,另一個運算數(shù)則必須是整數(shù)或浮點型的,運算時是這樣進行處理的:如果一個運算數(shù)是一個整型數(shù),那么這個運算數(shù)應轉換為與另一個一樣的浮點型形式:如果兩者中有一個運算數(shù)為double型,那么另一個運算數(shù)應轉換為double型。,2.2.3 浮點型,浮點數(shù)的運算包括賦值運算是不會

22、產(chǎn)生異常,相反當出現(xiàn)異常時,浮點數(shù)產(chǎn)生0,infinity或NaN,如下所述: 如果浮點運算無效,結果變?yōu)镹aN。 如果一個浮點數(shù)或兩個都是NaN,運算結果是NaN 如果浮點運算的結果太小,結果將變?yōu)檎慊蜇摿恪?如果浮點運算的結果太大,結果將變?yōu)檎裏o窮或負無窮。,2.2.4 結構類型,C#中的結構類型是包含構造函數(shù)、常量、字段、方法、屬性、索引器、運算符和嵌套類型的值類型。其聲明格式如下: 附加屬性 修飾符 struct 結構類型名 :接口表 各成員聲明 說明: 附加屬性:附加的聲明信息。 修飾符:允許的修飾符有new 和public、protected、internal、private的有

23、效組合,默認的訪問性為private。 接口表:包含結構所實現(xiàn)的接口的列表。,2.2.5 枚舉型,C#語言中引用了枚舉型,“枚舉”將變量可取得值全部列舉出來。 枚舉類型聲明一組相關的符號常量定義了一個類型名。枚舉具有代表性應用在“多選”中,其中運行期由編譯期間的已知選項決定。其聲明格式如下: 附加屬性 枚舉修飾符 enum 枚舉類型名 枚舉基類型名 枚舉值表 ,2.2.5 枚舉型,例如: enum Myenum aa0, aa1, aa2 , aa3, aa4 , aa5 , aa6 ; /aa0為0,aa1為1 依次類推。 可以用顯示數(shù)值分配重寫枚舉成員對應的枚舉數(shù)值。 enum Myenu

24、m aa0=1, aa1, aa2 , aa3, aa4 , aa5 , aa6 ; /aa0為1,aa1為2 依次類推。,返回,2.3 引用類型,引用類型的變量存儲的是對其數(shù)據(jù)對象(該實例)的引用。有可能兩個變量引用相同的對象,對其中一個變量所引用對象的操作會影響到另一個變量所引用的對象。而對于值類型,每個變量都有它們自己的數(shù)據(jù)值,所以對一個變量的操作不可能影響到其他變量。,2.3.1 數(shù)組,數(shù)組是一組可以通過下標來訪問的數(shù)。包含在數(shù)組中,變量又叫數(shù)組的元素,同一數(shù)組的數(shù)組元素具有相同的類型,此類型稱為數(shù)組元素的類型。 數(shù)組的每個維度都有一個關聯(lián)的長度(一個大于或等于零的整數(shù))。數(shù)組類型聲明

25、時只確定維數(shù),維的長度不是數(shù)組類型的一部分,而是創(chuàng)建數(shù)組時被確定的。 數(shù)組中元素的類型可以是任何類型,包括數(shù)組類型。下面用一個數(shù)組初始化器初始化的數(shù)組: string MyArray=“ A”, “B”, “C”; 該簡寫效果等同于以下代碼: MyArray=“ A”; MyArray= “B”;MyArray= “C”;,2.3.2 類,類定義了一種數(shù)據(jù)結構,它包括常量、字段、方法、屬性、事件、索引、運算符、構造函數(shù)、析構函數(shù)和嵌套類型的說明。除了某些導入的外部方法,類及其成員在C#中的聲明和實現(xiàn)通常需要放在一起。 類類型支持繼承,因為這種機制派生的可以對基類進行擴展和特殊化。C#中僅允許單

26、個繼承,類只能從一個基類繼承實現(xiàn)。但一個類可以實現(xiàn)一個以上的接口,使用對象創(chuàng)建表達式來創(chuàng)建類實例。,2.3.2 類,每個成員都有一個訪問可見性的標識,它們共有5種: public:訪問不被限制。 protected:訪問限制在包含類或包含類的派生類中。 internal:訪問限制在本程序中內。 protected internal :訪問限制在本程序中或包含類的派生類中。 private:訪問限制在包含類中。,2.3.3 委托,在C語言或C+語言中,可以用“指向函數(shù)的指針”來實現(xiàn)函數(shù)參數(shù)的傳遞。而在C#中則專門定義了委托類型來實現(xiàn)這一功能。不過與C語言或C+函數(shù)指針不同,委托是完全針對對象的;

27、另外C+指針僅指向成員函數(shù),而委托同時封裝了對象實例和方法。 委托聲明定義一個從System.Delegate類派生的類。在類型聲明時,需要定義它引用的方法的參數(shù)類型和返回類型。創(chuàng)建委托實例時,將對實際方法的引用封裝在該委托實例內。用一組適當?shù)膮?shù)可以調用該委托實例,也就間接調用了所封裝的方法,實現(xiàn)“匿名調用”,調用該委托時不必知道具體調用的是哪個方法。,2.3.3 委托,委托類型使用前必須用委托類型聲明來定義,委托類型聲明格式: 附加屬性 委托修飾符 delegate 返回類型名 委托類型名(形參表); 說明: 附加屬性:附加聲明信息。 委托修飾符:允許的修飾符有new和四個訪問修飾符。 返

28、回類型名:委托類型的返回類型,即所封裝方法的返回類型。 委托類型名:委托類型名標識符。 形參表:指定委托的參數(shù)列表,相當于所封裝方法的返回形參表,2.3.3 委托,C#中的委托類型是名稱等效的,而不是結構等效的。具體地說,對于兩個委托類型,即使它們具有相同的參數(shù)列表和返回類型,仍被認為是不同的兩個委托類型。不過,這樣兩個彼此不同的但結構又相同的委托類型,它們的實例在比較時可以認為是相等關系。例如: delegate int Dlgt1(int i,double d); Class MyCLassA public static int M1(int a, double b) ,2.3.3 委托,

29、class MyClassB delegate int Dlgt2(int c,double d); public static int M1(int f, double g) public static void M2(int k,double l) public static int M3(int g) public static void M4(int g) 委托類型Dlg1和Dlg2都與方法MyClassA.M1和MyClassB.M1兼容,這是因為它們具有相同的返回類型和參數(shù)列表;但是委托類型是兩個不同類型,所以它們是不可互換的。委托類型Dlgt1和Dlgt2與方法MyClassB.

30、M2、MyClassB.M3和MyClassB.M4不兼容,這是因為它們具有不同的返回類型或參數(shù)列表。,返回,2.4 異常處理,隨著軟件規(guī)模和復雜性不斷增加,在程序中出現(xiàn)錯誤和不穩(wěn)定代碼的可能性也在隨之增加。在現(xiàn)在的程序設計和實現(xiàn)中,大量的時間和精力都被花費在程序的測試、查找和修改錯誤上。程序的錯誤一般可以分為兩種:編譯錯誤和運行時錯誤。 1)編譯錯誤:程序使用了錯誤的語法、函數(shù)、結構或是類等,這樣的程序一般是無法被編譯器正確編譯通過的。 2)運行時錯誤:分為不可預料的邏輯錯誤和可預料的運行異常。,2.4 異常處理,不可預料的邏輯錯誤:是由于不當?shù)脑O計造成的,對這類錯誤,只有通過長時間的、全面

31、的測試才能發(fā)現(xiàn),一旦發(fā)現(xiàn)可以專門寫一段錯誤處理程序,或是改進原來的邏輯設計。 可預料的運行異常:運行異常是可預料的,它是由系統(tǒng)的運行環(huán)境造成的。 那么什么是異常?其實,異常是一種程序定義的錯誤,它是對可能存在的運行時錯誤進行處理的一套機制,它對程序的邏輯錯誤進行設防,對運行異常加以控制。,2.4 異常處理,C# 可以處理在程序執(zhí)行期間可能出現(xiàn)的異常情況。這些異常由正常程序流之外的代碼處理。C# 提供了一種構造化的、統(tǒng)一的和類型安全的異常處理機制,既能處理系統(tǒng)級又能處理應用程序的異常。C#中的異常機制與C+中的很相似,但仍有以下幾點不同: 1)在C#中,所有的異常都表示為一個類的對象,這個類必須

32、為System.Exception類或是它的派生類,而在C+中,任何類型的值都可以表示異常。 2)在C#中,異常處理有一個終結(finally)塊,用來添加異常處理的結束代碼,無論是正常執(zhí)行還是異常條件,終結塊都會被執(zhí)行,而在C+中,只有通過復制處理代碼的方法才能實現(xiàn)相同的功能。 3)在C#中,對于系統(tǒng)級的異常(如 溢出、除0和null引用等),系統(tǒng)都已提供了預定義好的異常類,所以它們可以等同于應用程序級的錯誤處理條件。,2.4 異常處理,在C#中異常處理的實現(xiàn)主要有下面4個步驟: 1)捕捉異常(try語句)將那些有可能產(chǎn)生異常的語句包含到try語句塊中。 2)處理異常(catch語句)將針對

33、異常的處理語句放在catch語句塊中,在特定的異常被捕獲時執(zhí)行處理語句。 3)清除異常(finally語句)無論try語句塊中包含的語句是否產(chǎn)生異常,都要執(zhí)行finally語句塊中的語句。 4)拋出異常(throw異常)允許程序在某些條件下自己產(chǎn)生異常。,2.4.1 try塊和catch塊,try塊和catch塊組合完成捕獲和處理異常的工作。在當前詞法封裝的try語句層中,一個try塊后面可跟一或多個catch子句(為不同異常指定處理程序),構成try-catch語句,可以采用下列形式之一:,2.4.1 try塊和catch塊,采用從System.Exception派生的對象參數(shù),處理特定的異

34、常。 try 代碼塊0 catch(異常對象) 代碼塊1 catch(異常對象) 代碼塊2 帶任何參數(shù)的catch子句,它捕獲任何類型的異常,稱之為一般catch子句。 try 代碼塊0 catch 代碼塊1,2.4.1 try塊和catch塊,例題2.4 using System; class testApp static int zero=0; public static void Main() /捕捉異常 try int a=100/zero; Console.WriteLine(a=0,a); ,2.4.1 try塊和catch塊,/處理異常 /定義異常處理變量 catch(Excep

35、tion e) Console.WriteLine(there is an Exception :+e.Message); Console.WriteLine(Afer exception handling !); 輸出結果: there is an Exception :試圖除以零 Afer exception handling !,2.4.2 使用throw產(chǎn)生異常,執(zhí)行時立即無條件地拋出一個指定的異常對象。其形式為: throw 異常對象 說明: 異常對象:throw語句的異常對象。拋出的異常必須是從System.Exception派生類型的對象,如: class MyException

36、 : System.Exception throw new MyException( );,2.4.2 使用throw產(chǎn)生異常,例題2.5 using System; public class ThrowTest public static void Main() string s=null;,2.4.2 使用throw產(chǎn)生異常,if(s=null) throw (new ArgumentNullException(); Console.WriteLine(This string s is null); /此句不被執(zhí)行 輸出結果: 未處理的異常:System.ArgumentNullExcep

37、tion:值不能為空 at ThrowTest.Main(),2.4.3 使用finally,清除異常(finally語句)無論try語句塊中包含的語句是否產(chǎn)生異常,都要執(zhí)行finally語句塊中的語句。不管try是否成功執(zhí)行,finally塊一定會執(zhí)行,這樣保證了finally塊是放置資源釋放代碼的理想位置,這些資源是在相應try塊中,請求和操作的。如果try塊成功執(zhí)行,那么在try塊終止后立即執(zhí)行finally塊,如果try塊中出現(xiàn)異常,則在catch程序執(zhí)行后,立即執(zhí)行finally塊。如果異常沒有被try相關的某個catch塊捕獲或者和try塊相關的catch處理,程序拋出一個異常,則

38、執(zhí)行finally塊,接著異常被下一個封裝的try塊處理。,2.4.3 使用finally,有try-finally和try-catch-finally兩種組合: 1. try-finally組合 finally塊用于釋放在try塊中分配的任何資源。即從try結構出去之前,控制總是傳遞給finally塊,與try塊的流程控制方式無關。Finally子句的一般形式: finally 代碼塊,2.4.3 使用finally,2. try-catch-finally組合 try-catch-finally一起使用時,通常是在try中獲取并使用資源,在catch塊中處理try語句塊中出現(xiàn)的異常情況,在

39、finally塊中進行善后處理并釋放資源。無論是否捕捉到異常,出本try層之前總要執(zhí)行finally塊。即try結構的流程控制必定是從try塊進入,從finally塊出去。與前面的try結構的流程控制方式無關。,返回,2.5 C#面向對象的編程,C#語言是完全面向對象的一種語言。C#秉承了C+面向對象的特性,支持面向對象的所有關鍵概念。在面向對象的語言中,類是非常重要的概念。C#沒有C+中的全局常數(shù)和全局函數(shù),一切都必須封裝在一個類中。類是一個數(shù)據(jù)類型,它包含數(shù)據(jù)成員(常數(shù)和字段)、函數(shù)成員(方法、屬性、事件、索引、操作符、構造函數(shù)和析構函數(shù))和嵌套類型的描述,類類型的實例就是對象。,2.5.

40、1 類的定義,類的成員可以分為兩大類:類本身所聲明的,以及從基類中繼承而來的。 類聲明聲明了一個新類。格式如下: 附加屬性 類修飾符 class 類名標示符 類基 類主體;,2.5.1 類的定義,類成員聲明的規(guī)則: 構造函數(shù)和析構函數(shù)必須與直接包含它們的類有相同的名稱。所有其它的成員則不能與直接包含它們的類同名。 常數(shù)、字段、事件或類型不能與在相同類中聲明的其它成員同名。 方法的名稱必須與同一個類中聲明的其它非方法的名稱不同。另外,同一個類中聲明的各方法的簽名(名稱和形參表合起來)之間必須不同。 同一個類中聲明的各索引的簽名之間必須不同。 同一個類型聲明的各操作符的簽名之間必須不同。,2.5.

41、2 繼承,C#是完全面向對象的程序設計語言,它擁有面向對象的程序的設計中最基本的特征,有良好的繼承機制,它可以讓派生類從它的基類繼承成員。這樣,已設計好的成熟的基類成員就可以通過繼承充分地共享;在設計一個新的特殊類時,這些從基類繼承的成員都可以直接引用不需重新設計。繼承機制提高了代碼的可重用性,減少了重復勞動,降低了開發(fā)難度,增強了軟件的安全性和可靠性,加快了和軟件開發(fā)的速度。,2.5.2 繼承,C+允許多繼承,派生類可以從多個直接基類繼承,這往往會影響程序的可讀性,并帶來許多不安全的因素。C#則采用了更安全更容易理解的單繼承和多接口實現(xiàn)的方式;但繼承意味著派生類只能從一個直接基類繼承,它直觀

42、安全;通過多個接口實現(xiàn)的方式還可以間接地實現(xiàn)多繼承的功能。 C#中,派生類包含了直接基類中除構造函數(shù)和析構函數(shù)外的所有的數(shù)據(jù)成員和函數(shù)成員成員。C#提供了大量的一般基類(標準類),用戶開發(fā)新系統(tǒng)時可以從這些基類派生出新類,在繼承基類原有成員的同時,還可以對基類進行擴展,以保證程序的靈活性。,2.5.2 繼承,C#的繼承要點如下: 1、繼成具有共享特征,派生類可以共享基類的數(shù)據(jù)和代碼。 2、繼承有層次關系,有傳遞性。 3、繼承有可擴展性,派生類可以增加新的成員,還可以對繼承的成員進行特殊化,這部分是非共享的數(shù)據(jù)和代碼,它使派生類和基類間具有差別,保證了程序的靈活性。但派生類不能被訪問。,2.5.

43、2 繼承,4、構造函數(shù)和析構函數(shù)不能被繼承,其它所有成員都可以繼承。 5、派生類可以通過聲明同名新成員來隱藏繼承的成員,然而被隱藏的繼承成員并沒有刪除,它只是不能從派生類訪問。 6、基類可以聲明虛擬和抽象的函數(shù)成員,在派生類可以用重寫成員來重寫這些函數(shù)成員,實現(xiàn)運行時的多態(tài)性。,2.5.3 類的訪問修飾符,在類聲明中的類修飾符包括:new,public,protected,internal,private,abstract(抽象),sealed(密封)。 只有對嵌套類的聲明才可使用new修飾符,表示隱藏了與所聲明類同名的繼承成員。修飾符abstract聲明該類是抽象類,抽象類是不完整的,它只能

44、作為其它類的基類。抽象類不能被實例化,在抽象類上使用new操作符是錯誤的。sealed修飾符用來表示該類是密封類,密封類不能作其它類的基類,既不能派生其它類,sealed修飾符主要用于防止無意的派生。,2.5.3 類的訪問修飾符,修飾符中有4個修飾符,它們是一些關鍵字,用于聲明成員或類型的可訪問性。 public(公共訪問)是允許的最高訪問級別,對于public成員或類型,訪問不受限制。 protected(受保護的)訪問僅限于包含類或從該類派生的類型。包含類即用它修飾的成員或類型所在類(含嵌套類),只有在所在類中以及從該類派生的類中訪問它。,2.5.3 類的訪問修飾符,internal訪問僅

45、限于當前項目內,只有在同一程序集中的文件內才是可訪問的。內部訪問通常用于基于組件的開發(fā),它使一組組件能夠以內部方式進行合作,而不必向應用程序代碼的其余部分公開。 private(私有的)私有訪問是允許的最低訪問級別。只能在所在的類(含嵌套類)和結構體中才是可訪問的。,2.5.3 類的訪問修飾符,4個訪問修飾符可組成5種可訪問性 public公共的 protected保護的 internal內部的 protected internal內部保護的 private私有的,2.5.4 構造函數(shù)和析構函數(shù),1.構造函數(shù) 構造函數(shù)是執(zhí)行對類或實例進行初始化的函數(shù)成員,在類被加載或實例被創(chuàng)建時,構造函數(shù)自動

46、被調用。 在編寫程序的時候,構造函數(shù)不同于其他成員函數(shù),它們的名字與它們所屬的類相同。當某類對象創(chuàng)建或拷貝時,要隱含調用相應的構造函數(shù)。,2.5.4 構造函數(shù)和析構函數(shù),實例構造函數(shù) 實例構造函數(shù)是創(chuàng)建實例時,用于執(zhí)行對類的實例進行初始化的函數(shù)成員,實例構造函數(shù)是使用構造函數(shù)聲明來聲明來聲明的,格式為: 附加屬性 構造函數(shù)修飾符 標識符(形參表) 構造函數(shù)體,2.5.4 構造函數(shù)和析構函數(shù),例如: class A int x = 0 , y=0 , count; public A( ) count = 0 ; /聲明不帶參數(shù) public A( int vx , int vy ) x = vx

47、 ; y = vy ; /聲明帶參數(shù)的實例構造函數(shù) ,2.5.4 構造函數(shù)和析構函數(shù),靜態(tài)構造函數(shù): 靜態(tài)構造函數(shù)是實現(xiàn)對一個類進行初始化的函數(shù)成員。靜態(tài)構造函數(shù)不能有參數(shù),不能有修飾符而且不能被調用,當類被加載時,類的靜態(tài)構造函數(shù)自動被調用。 靜態(tài)構造函數(shù)是使用靜態(tài)構造函數(shù)聲明來聲明的,聲明格式為: 附加屬性 extern static 標識符 () 構造函數(shù)體,2.5.4 構造函數(shù)和析構函數(shù),靜態(tài)構造函數(shù)執(zhí)行的時間是依賴于實現(xiàn)的,必須遵循以下規(guī)則: 只有執(zhí)行一個類的靜態(tài)構造函數(shù)之后,才能創(chuàng)建該類的任何實例。 只有執(zhí)行某個類的靜態(tài)構造函數(shù)之后,才能引用該類的任何靜態(tài)成員 在單個程序實例化過程

48、中,類的靜態(tài)構造函數(shù)最多執(zhí)行一次。,2.5.4 構造函數(shù)和析構函數(shù),2.析構函數(shù) 析構函數(shù)是在撤銷類的實例時調用的函數(shù)成員,所以又稱為實例析構函數(shù)。析構函數(shù)名與類名相同,只有前面加一個符號。析構函數(shù)是使用析構函數(shù)聲明來聲明的: 附加屬性 extern 標示符 () 析構函數(shù)體,2.5.4 構造函數(shù)和析構函數(shù),析構函數(shù)不帶參數(shù),而且不能被顯式調用。析構函數(shù)在系統(tǒng)進行碎片收集時會被自動調用。當任何代碼都不能再使用某個實例時,該實例就符合撤銷的條件。符合撤銷條件之后的某個時刻會執(zhí)行實例的析構函數(shù)。當撤銷實例時,按照從派生程度最大到派生程度最小的順序調用它的繼承鏈中的析構函數(shù)。 由于析構函數(shù)要求不帶參

49、數(shù),因此它不能被重載。所以,一個類只能有一個析構函數(shù)。,2.5.5 this和static關鍵字,1.this關鍵字 關鍵字this表示對當前實例的引用,不表示靜態(tài)的引用。保留字this訪問僅限于在構造函數(shù)、實例方法和類的實例中使用,不能在靜態(tài)方法、靜態(tài)屬性訪問器或字段聲明的初始化式中使用。this訪問的含義是:,2.5.5 this和static關鍵字,在類的構造函數(shù)中出現(xiàn)的this表示對正在創(chuàng)建的對象的引用。 在實例方法中,它表示對調用該方法的對象的引用。 在結構的構造函數(shù)中出現(xiàn)的this表示對正在構造的結構的引用。 在結構的方法中出現(xiàn)的this表示對調用該方法的結構的引用。,2.5.5

50、this和static關鍵字,2.static關鍵字 常量或類型聲明隱含聲明為靜態(tài)成員。其他各種成員用static關鍵字聲明為靜態(tài)成員。靜態(tài)成員有以下幾種特征: 1)以E.M形式訪問靜態(tài)成員時,E必須為一個類,不能是實例。 2)類中的靜態(tài)字段僅分配一個存儲單元。無論類中有多少實例被創(chuàng)建,也僅有一個靜態(tài)字段的拷貝。 3)類的靜態(tài)函數(shù)成員中不能用簡單名稱訪問實例成員,在靜態(tài)函數(shù)成員中使用this是錯誤的。,2.5.5 this和static關鍵字,反之,當字段、方法、屬性、事件、索引、構造函數(shù)或析構函數(shù)的聲明中不包括static關鍵字時,它就是實例成員。實例成員也被稱為非靜態(tài)成員。非靜態(tài)成員有以下

51、幾種特征: 1)以E.M形式訪問當實例成員時,E必須是一個實例,不能是類。 2)類中的每個實例都包含該類的實例字段的單獨一份拷貝。 3)類的實例函數(shù)成員中可用簡單名稱來訪問實例成員和靜態(tài)成員,可以通過this來訪問實例成員。 4)靜態(tài)成員必須通過類訪問,實例成員必須通過實例訪問。,2.5.6 多態(tài)性,多態(tài)性是面向對象程序設計中另外一個重要特征。多態(tài)性是類為以相同名稱調用的函數(shù)成員提供不同實現(xiàn)方式的能力。多態(tài)性允許對類的某個方法進行調用而無需考慮該方法所提供特定實現(xiàn)。C#支持兩種多態(tài)性,一種是編譯時的多態(tài)性。在系統(tǒng)編譯時,根據(jù)同名操作傳遞的參數(shù)的個數(shù)和類型等信息,選擇何種操作。另一種是運行的多態(tài)

52、性,是在程序運行時,根據(jù)實際情況確定執(zhí)行何種操作。 編譯時的多態(tài)性是通過方法和操作符的重載來實現(xiàn)的。,2.5.7 虛方法,方法是類中執(zhí)行計算或行為的函數(shù)成員,可以通過類或對象來訪問。通過類訪問的方法是靜態(tài)方法。通過類的實例訪問的方法是非靜態(tài)方法。方法聲明格式: 附加屬性 修飾符組 返回值類型 方法名(形參表) 方法體,2.5.7 虛方法,當實例方法聲明中包含virtual修飾符時,方法就稱為虛方法。當沒有virtual修飾符時,方法被稱為是非虛方法。 不能既包含virtual又包含static、abstract或override修飾符。 非虛方法調用中,類的實例的編譯時類型決定要調用的實際方法

53、。而在虛方法調用中,實例的運用時類型決定要調用的實際方法。,2.5.7 虛方法,例如: class A public void F() Console.WriteLine(“A.F”); /非虛方法F public virtual void G() Console.WriteLine(“A.G”); /虛方法G ,2.5.8 抽象類,當一個方法聲明包括abstract修飾符,這個方法就是抽象方法。抽象方法是默認的虛方法。抽象方法聲明引入了一個新的虛方法,它的主體只有一個分號,不提供具體的實現(xiàn)代碼。 只能在抽象類中聲明抽象方法。抽象方法聲明中不含static、virtual或override修飾

54、符。 例如: public abstract class Shape public abstract void Paint(Graphics g , Rectangle r) ,2.5.8 抽象類,public class Ellipse : Shape public override void Paint( Graphics g , Rectangle r ) g . drawEllipse( r ); public class Box : Sharp public override void Paint( Graphics g , Rectangle r ) g . drawRect ( r ); ,2.5.9 函數(shù)重載,在函數(shù)的調用中,經(jīng)常需要對于不同的參數(shù)列表調用不同的方法,如求最大整數(shù)的函數(shù)和求最大實數(shù)的函數(shù)。在表達式中使用的操作符,也經(jīng)常需要對于不同類型

溫馨提示

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

評論

0/150

提交評論