ASPNET4.0基礎(chǔ)教程(C#)第二章C#語(yǔ)言快速掌握.ppt
重點(diǎn)內(nèi)容:數(shù)據(jù)類型變量和常量運(yùn)算符流程控制類和對(duì)象委托與事件C#4.0的新特性,第2章C#語(yǔ)言快速掌握,一、數(shù)據(jù)類型,C#中數(shù)據(jù)類型可以分為值類型和引用類型,如圖所示。值類型又可以稱為數(shù)值類型,其中包含枚舉類型(EnumTypes)和結(jié)構(gòu)類型(StructTypes);引用類型包含類類型(ClassTypes)、對(duì)象類型(ObjectTypes)、字符串類型(StringTypes)、數(shù)組類型(ArrayTypes)、接口類型(InterfaceTypes)和代理類型(DelegateTypes)等。,一、數(shù)據(jù)類型,一、數(shù)據(jù)類型,1、值類型,值類型主要由結(jié)構(gòu)和枚舉組成,其中結(jié)構(gòu)又可以分為:數(shù)值類型、bool類型和用戶定義的結(jié)構(gòu)?;谥殿愋偷淖兞恐苯影担▽?duì)于這句話,讀者在學(xué)習(xí)完引用類型后會(huì)有更深的理解)。將一個(gè)值類型變量賦給另一個(gè)值類型變量時(shí),將復(fù)制包含的值。,一、數(shù)據(jù)類型,1、值類型,數(shù)值類型:數(shù)值類型主要包括整數(shù)、浮點(diǎn)數(shù)和小數(shù)。整數(shù):整數(shù)類型可以分為無(wú)符號(hào)型、有符號(hào)型和char,其中無(wú)符號(hào)型包括:byte,ushort,uint和ulong;有符號(hào)型包括:sbyte,short,int和long。char在C#中表示16位Unicode字符浮點(diǎn)數(shù):單精度浮點(diǎn)(float)類型和雙精度浮點(diǎn)(double)類型。小數(shù):小數(shù)(decimal)類型在所有數(shù)值類型中精度是最高的,它有128位,一般做精度要求高的金融和貨幣的計(jì)算。,一、數(shù)據(jù)類型,1、值類型,示例代碼:intin=10;/整型charaa=c;/字符串floata=1.0f;/浮點(diǎn)數(shù)doubleb=1.0d;/雙精度decimaldec=2.2m;/小數(shù)類型,一、數(shù)據(jù)類型,1、值類型,(2)布爾類型布爾(bool)類型表示布爾邏輯量,對(duì)應(yīng)于.NETFramework中定義的System.Boolean類。布爾類型的可能值為true和false(僅有true和false兩個(gè)布爾值),其中true表示邏輯真,false表示邏輯假??梢灾苯訉rue或false值賦給一個(gè)布爾變量,或?qū)⒁粋€(gè)邏輯判斷語(yǔ)句的結(jié)果賦給布爾類型的變量,一、數(shù)據(jù)類型,1、值類型,(2)布爾類型,示例代碼:booltest=true;boolisBig=1000),4、邏輯運(yùn)算符,三、運(yùn)算符,5、條件運(yùn)算符,C#中唯一的一個(gè)三元操作符就是條件運(yùn)算符(?:),由條件運(yùn)算符組成的表達(dá)式就是條件表達(dá)式,條件表達(dá)式的一般格式為:操作數(shù)1?操作數(shù)2:操作數(shù)3。,示例代碼:inta=3;intb=5;intc=a>b?100:-10;,三、運(yùn)算符,7、運(yùn)算符的優(yōu)先級(jí),在C#中為這些運(yùn)算符定義了不同的優(yōu)先級(jí),相同優(yōu)先級(jí)的運(yùn)算符,除了賦值運(yùn)算符按照從右至做的順序執(zhí)行之外,其余運(yùn)算符按照從左至右的順序執(zhí)行。括號(hào)是優(yōu)先級(jí)最高的,可以任意的改變符號(hào)的計(jì)算順序。在C#中運(yùn)算符的優(yōu)先級(jí)定義如右表所示,其中1級(jí)表示最高優(yōu)先級(jí),12級(jí)表示最低優(yōu)先級(jí)。,7、運(yùn)算符的優(yōu)先級(jí),四、流程控制,一般來(lái)說,程序代碼除了順序執(zhí)行之外,對(duì)于復(fù)雜的工作,為了達(dá)到預(yù)期的執(zhí)行結(jié)果,還需要使用“流程控制結(jié)構(gòu)”來(lái)控制程序的執(zhí)行。流程控制語(yǔ)句是使用條件表達(dá)式來(lái)進(jìn)行判斷,以便執(zhí)行不同的程序代碼段,或是重復(fù)執(zhí)行指定的程序代碼段。,四、流程控制,1、條件語(yǔ)句,(1)if語(yǔ)句if語(yǔ)句是最常用的分支語(yǔ)句,使用該語(yǔ)句可以有條件地執(zhí)行其他語(yǔ)句。if語(yǔ)句的最基本使用格式為:if(測(cè)試條件)測(cè)試條件為true時(shí)的代碼或者代碼塊if語(yǔ)句可以和else語(yǔ)句合并執(zhí)行,使用格式如下:if(測(cè)試條件)測(cè)試條件為true時(shí)的代碼或者代碼塊else測(cè)試條件為false時(shí)的代碼或者代碼塊,(1)if語(yǔ)句示例staticvoidMain(stringargs)Console.WriteLine("請(qǐng)輸入第一個(gè)數(shù):");doublevar1=Convert.ToDouble(Console.ReadLine();Console.WriteLine("請(qǐng)輸入第二個(gè)數(shù):");doublevar2=Convert.ToDouble(Console.ReadLine();stringcomparison;/進(jìn)行判斷,根據(jù)var1和var2的值設(shè)置comparisonif(var1<var2)comparison="小于"elseif(var1=var2)comparison="等于"elsecomparison="大于"/打印結(jié)果Console.WriteLine("012",var1,comparison,var2);/暫停程序的執(zhí)行,給用戶機(jī)會(huì)瀏覽輸出結(jié)果Console.WriteLine("nn按回車鍵退出程序");Console.ReadLine();,四、流程控制,1、條件語(yǔ)句,(2)switch語(yǔ)句switch語(yǔ)句非常類似于if語(yǔ)句,它也是根據(jù)測(cè)試的值來(lái)有條件地執(zhí)行代碼,實(shí)際上switch語(yǔ)句完全可以使用if語(yǔ)句代替。一般情況下,如果只有簡(jiǎn)單的幾個(gè)分支就需要使用if語(yǔ)句,否則建議使用switch語(yǔ)句,這樣可以使代碼的執(zhí)行效率比較高。switch語(yǔ)句的基本語(yǔ)法定義如下:,1、條件語(yǔ)句,switch(測(cè)試值)case比較值1:當(dāng)測(cè)試值等于比較值1時(shí)要執(zhí)行的代碼break;case比較值2:當(dāng)測(cè)試值等于比較值2時(shí)要執(zhí)行的代碼break;.case比較值n:當(dāng)測(cè)試值等于比較值n時(shí)要執(zhí)行的代碼break;default:當(dāng)測(cè)試值不等于以上各個(gè)比較值時(shí)要執(zhí)行的代碼break;,(2)switch語(yǔ)句示例staticvoidMain(stringargs)Console.WriteLine("本系統(tǒng)使用1-7代表一周的每一天,請(qǐng)輸入其中一個(gè)11.數(shù)字,系統(tǒng)將返回該數(shù)字代表的星期數(shù)。");intvar=Convert.ToInt32(Console.ReadLine();switch(var)case1:Console.WriteLine("您選擇的是星期一");break;case2:Console.WriteLine("您選擇的是星期二");break;case3:Console.WriteLine("您選擇的是星期三");break;case4:Console.WriteLine("您選擇的是星期四");break;case5:Console.WriteLine("您選擇的是星期五");break;case6:Console.WriteLine("您選擇的是星期六");break;case7:Console.WriteLine("您選擇的是星期日");break;default:Console.WriteLine("您輸入的數(shù)字有誤,請(qǐng)重新輸入");break;Console.WriteLine("n按回車鍵退出程序");Console.ReadLine();,四、流程控制,2、循環(huán)語(yǔ)句,(1)do-while循環(huán)do-while語(yǔ)句根據(jù)其布爾表達(dá)式的值有條件的執(zhí)行它的嵌套語(yǔ)句一次或者多次,其語(yǔ)法定義如下:do循環(huán)代碼while(布爾表達(dá)式);,四、流程控制,2、循環(huán)語(yǔ)句,示例代碼:inti=1;doConsole.WriteLine("0",i+);while(i<=10);,四、流程控制,2、循環(huán)語(yǔ)句,(2)while循環(huán)while循環(huán)非常類似于do循環(huán),其語(yǔ)法定義如下:while(布爾表達(dá)式)循環(huán)代碼,四、流程控制,2、循環(huán)語(yǔ)句,示例代碼:inti=1;while(i<=10)Console.WriteLine("0",i+);,四、流程控制,2、循環(huán)語(yǔ)句,(3)for循環(huán)for循環(huán)是最常用的一種循環(huán)語(yǔ)句,這類循環(huán)可以執(zhí)行指定的次數(shù),并維護(hù)它自己的計(jì)數(shù)器。for語(yǔ)句首先計(jì)算一系列初始表達(dá)式的值,接下來(lái)當(dāng)條件成立時(shí),執(zhí)行其嵌套語(yǔ)句,之后計(jì)算重復(fù)表達(dá)式的值并根據(jù)其值決定下一步的操作。for循環(huán)的語(yǔ)法定義如下:for(循環(huán)變量初始化;循環(huán)條件;循環(huán)操作)循環(huán)代碼,四、流程控制,2、循環(huán)語(yǔ)句,示例代碼:for(inti=1;i<=10;i+)Console.WriteLine("0",i);,五、類和對(duì)象,面向?qū)ο蟮某绦蛟O(shè)計(jì)(OOP:Object-OrientedProgramming)是一種基于結(jié)構(gòu)分析的、以數(shù)據(jù)為中心的程序設(shè)計(jì)方法。其主要思想是將數(shù)據(jù)及處理這些數(shù)據(jù)的操作都封(Encapsulation)到一個(gè)稱為類(Class)的數(shù)據(jù)結(jié)構(gòu)中,使用這個(gè)類時(shí),只需要定義一個(gè)類的變量即可,這個(gè)變量叫做對(duì)象(Object)。,1、類,類中包含數(shù)據(jù)成員(常數(shù)、域和事件)、功能成員(方法、屬性、索引、操作符、構(gòu)造函數(shù)和析構(gòu)函數(shù))和嵌套類型。類類型支持繼承,派生的類可以對(duì)基類進(jìn)行擴(kuò)展和特殊化。面向?qū)ο蟮木幊谭椒ㄊ浅绦蛟O(shè)計(jì)的一次大的進(jìn)步,程序員跳出了結(jié)構(gòu)化程序設(shè)計(jì)的傳統(tǒng)方法。,五、類和對(duì)象,1、類,與傳統(tǒng)的面向過程的設(shè)計(jì)方法相比,采用面向?qū)ο蟮脑O(shè)計(jì)方法設(shè)計(jì)的程序可維護(hù)性較好,源程序易于閱讀和理解和修改,降低了復(fù)雜度。類的可繼承特性,使得程序代碼可以復(fù)用,子類中可以繼承祖先類中的部分代碼。由于類封裝了數(shù)據(jù)和操作,從類外面看,只能看到公開的數(shù)據(jù)和操作,而這些操作都在類設(shè)計(jì)時(shí)進(jìn)行安全性考慮,因而外界操作不會(huì)對(duì)類造成破壞。,五、類和對(duì)象,五、類和對(duì)象,1、類,C#中提供了很多標(biāo)準(zhǔn)的類,用戶在開發(fā)過程中可以使用這些類,這樣大大節(jié)省了程序的開發(fā)時(shí)間。C#中也可以自己定義類,類的定義方法為:類修飾符class類名:父類名成員修飾符類的成員變量或者成員函數(shù);,類修飾符,類成員修飾符,2、屬性和方法,在C#中,按照類的成員是否為函數(shù)將其分為兩大類,一種不以函數(shù)形式體現(xiàn),稱為成員變量,主要有以下幾個(gè)類型:常量:代表與類相關(guān)的常量值。變量:類中的變量。事件:由類產(chǎn)生的通知,用于說明發(fā)生了什么事情。類型:屬于類的局部類型。,2、屬性和方法,另一種是以函數(shù)形式體現(xiàn),一般包含可執(zhí)行代碼,執(zhí)行時(shí)完成一定的操作,被稱為成員函數(shù),主要有以下幾個(gè)類型:方法:完成類中各種計(jì)算或功能的操作,不能和類同名,也不能在前面加“”波浪線符號(hào)。方法名不能和類中其他成員同名。,2、屬性和方法,屬性:定義類的值,并對(duì)它們提供讀、寫操作。索引指示器:允許編程人員在訪問數(shù)組時(shí),通過索引指示器訪問類的多個(gè)實(shí)例,又稱下標(biāo)指示器。運(yùn)算符:定義類對(duì)象能使用的操作符。構(gòu)造函數(shù):在類被實(shí)例化時(shí)首先執(zhí)行的函數(shù),主要是完成對(duì)象初始化操作。構(gòu)造函數(shù)必須和類名相同。析構(gòu)函數(shù):在類被刪除之前最后執(zhí)行的函數(shù),主要是完成對(duì)象結(jié)束時(shí)的收尾操作。構(gòu)造函數(shù)必須和類名相同,并前加一個(gè)“”波浪線符號(hào)。,2、屬性和方法,屬性:定義類的值,并對(duì)它們提供讀、寫操作。索引指示器:允許編程人員在訪問數(shù)組時(shí),通過索引指示器訪問類的多個(gè)實(shí)例,又稱下標(biāo)指示器。運(yùn)算符:定義類對(duì)象能使用的操作符。構(gòu)造函數(shù):在類被實(shí)例化時(shí)首先執(zhí)行的函數(shù),主要是完成對(duì)象初始化操作。構(gòu)造函數(shù)必須和類名相同。析構(gòu)函數(shù):在類被刪除之前最后執(zhí)行的函數(shù),主要是完成對(duì)象結(jié)束時(shí)的收尾操作。構(gòu)造函數(shù)必須和類名相同,并前加一個(gè)“”波浪線符號(hào)。,C#中的類成員可以是任意類型,包括數(shù)組和集合。當(dāng)一個(gè)類包含了數(shù)組和集合成員時(shí),索引器將大大簡(jiǎn)化對(duì)數(shù)組或集合成員的存取操作。,五、類和對(duì)象,3、對(duì)象的創(chuàng)建,構(gòu)造函數(shù)是當(dāng)類被實(shí)例化時(shí)首先執(zhí)行的函數(shù),就是new關(guān)鍵字后面的函數(shù)。當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),系統(tǒng)首先給對(duì)象分配合適的內(nèi)存空間,隨后系統(tǒng)就自動(dòng)調(diào)用對(duì)象的構(gòu)造函數(shù)。因此構(gòu)造函數(shù)是對(duì)象執(zhí)行的入口函數(shù),非常的重要。在定義類時(shí),可以給出構(gòu)造函數(shù)也可以不定義構(gòu)造函數(shù)。如果類中沒有構(gòu)造函數(shù),系統(tǒng)會(huì)默認(rèn)執(zhí)行System.Object提供的構(gòu)造函數(shù)。,五、類和對(duì)象,3、對(duì)象的創(chuàng)建,如果要定義構(gòu)造函數(shù),那么構(gòu)造函數(shù)的函數(shù)名必須和類名一樣。構(gòu)造函數(shù)的類型修飾符總是公有類型public的,如果是私有類型private的,表示這個(gè)類不能被實(shí)例化,這通常用于只含有靜態(tài)成員的類中。構(gòu)造函數(shù)由于不需要顯式調(diào)用,因而不用聲明返回類型。構(gòu)造函數(shù)可以帶參數(shù)也可以不帶參數(shù)。具體實(shí)例化時(shí),對(duì)于帶參數(shù)的構(gòu)造函數(shù),需要實(shí)例化的對(duì)象也帶參數(shù),并且參數(shù)個(gè)數(shù)要相等,類型要一一對(duì)應(yīng)。如果是不帶參數(shù)的構(gòu)造函數(shù),因而在實(shí)例化時(shí)對(duì)象不具有參數(shù)。,3、對(duì)象的創(chuàng)建,示例publicclassShapeprotectedstringtype;protecteddoublex,y;publicShape()x=0;y=0;type="形狀"publicShape(doublex,doubley)this.x=x;this.y=y;type="形狀"publicvirtualdoubleGetArea()returnx*y;publicstringGetShapeType()returntype;,五、類和對(duì)象,4、對(duì)象的回收,析構(gòu)函數(shù)是當(dāng)實(shí)例對(duì)象從內(nèi)存中刪除前最后執(zhí)行的函數(shù)。析構(gòu)函數(shù)是一個(gè)實(shí)現(xiàn)破壞一個(gè)類的實(shí)例的行為的成員,和構(gòu)造函數(shù)不同,析構(gòu)函數(shù)在類撤銷時(shí)運(yùn)行,常用來(lái)處理類用完后的收尾工作。如果在對(duì)象在運(yùn)行過程中動(dòng)態(tài)申請(qǐng)了內(nèi)存控件,就需要在析構(gòu)函數(shù)中進(jìn)行回收工作。,五、類和對(duì)象,4、對(duì)象的回收,析構(gòu)函數(shù)不能帶有參數(shù),也不能被繼承,不能擁有訪問修飾符,并且不能顯式地被調(diào)用(在該對(duì)象被撤銷時(shí)自動(dòng)被調(diào)用)。一個(gè)析構(gòu)函數(shù)聲明的標(biāo)識(shí)符必須為聲明析構(gòu)函數(shù)的類命名,并要在前面加一個(gè)“”符號(hào),如果指定了任何其他名稱,就會(huì)發(fā)生一個(gè)錯(cuò)誤。,五、類和對(duì)象,4、對(duì)象的回收,示例classMyClassMyClass()/收尾工作,五、類和對(duì)象,5、繼承,繼承性是面向?qū)ο蟮囊粋€(gè)重要特性,C#中支持類的單繼承,即只能從一個(gè)類繼承。繼承是傳遞的,如果C繼承了B,并且B繼承了A,那么C繼承在B中聲明的public和protected成員同時(shí)也繼承了在A中聲明的public和protected成員。繼承性使得軟件模塊可以最大限度地復(fù)用,并且編程人員還可以對(duì)前人或自己以前編寫的模塊進(jìn)行擴(kuò)充,而不需要修改原來(lái)的源代碼,大大提高了軟件的開發(fā)效率。,五、類和對(duì)象,5、繼承,在定義類的時(shí)候可以指定要繼承的類,語(yǔ)法如下:類修飾符class類名:父類名成員修飾符類的成員變量或者成員函數(shù);派生類是對(duì)基類的擴(kuò)展,派生類可以增加自己新的成員,但不能對(duì)已繼承的成員進(jìn)行刪除,只能不予使用。基類可以定義自身成員的訪問方式,從而決定派生類的訪問權(quán)限。且可以通過定義虛方法、虛屬性,使它的派生類可以重載這些成員,從而實(shí)現(xiàn)類的多態(tài)性。,五、類和對(duì)象,6、多態(tài),類的另外一個(gè)特性是多態(tài)性,所謂多態(tài)性是指同一操作作用于不同類的實(shí)例,這些類進(jìn)行不同的解釋,從而產(chǎn)生不同的執(zhí)行結(jié)果的現(xiàn)象。例如假設(shè)矩形Rectangle,正方形Square,圓形Circle等類中都定義了一個(gè)叫ShowArea的成員函數(shù)用于顯示其面積,顯然當(dāng)調(diào)用不同的對(duì)象實(shí)例時(shí),會(huì)產(chǎn)生不同的結(jié)果。,六、委托與事件,1、委托,委托是一種安全地封裝方法的類型,它與C和C+中的函數(shù)指針類似。與C中的函數(shù)指針不同,委托是面向?qū)ο蟮?、類型安全的和保險(xiǎn)的。委托的類型由委托的名稱定義。一個(gè)委托可以看作一個(gè)特殊的類,因而它的定義可以像常規(guī)類一樣放在同樣的位置。與其他類一樣,委托必須先定義以后,再實(shí)例化。與類不同的是,實(shí)例化的委托沒有與之相應(yīng)的術(shù)語(yǔ)(類的實(shí)例化稱作對(duì)象),作為區(qū)分我們將實(shí)例化的委托稱為委托實(shí)例。,六、委托與事件,1、委托,下面的示例聲明了一個(gè)名為Del的委托,該委托可以封裝一個(gè)采用字符串作為參數(shù)并返回void的方法。publicdelegatevoidDel(stringmessage);,1、委托,委托具有以下特點(diǎn):委托類似于C+函數(shù)指針,但它是類型安全的。委托允許將方法作為參數(shù)進(jìn)行傳遞。委托可用于定義回調(diào)方法。委托可以鏈接在一起;例如,可以對(duì)一個(gè)事件調(diào)用多個(gè)方法。方法不需要與委托簽名精確匹配,匿名方法允許將代碼塊作為參數(shù)傳遞,以代替單獨(dú)定義的方法,六、委托與事件,2、事件,事件是類在發(fā)生其關(guān)注的事情時(shí)用來(lái)提供通知的一種方式。例如,封裝用戶界面控件的類可以定義一個(gè)在用戶單擊該控件時(shí)發(fā)生的事件??丶惒魂P(guān)心單擊按鈕時(shí)發(fā)生了什么,但它需要告知派生類單擊事件已發(fā)生。然后,派生類可選擇如何響應(yīng)。事件使用委托來(lái)為觸發(fā)時(shí)將調(diào)用的方法提供類型安全的封裝。委托可以封裝命名方法和匿名方法。,六、委托與事件,六、委托與事件,2、事件,事件具有以下特點(diǎn):事件是類用來(lái)通知對(duì)象需要執(zhí)行某種操作的方式。盡管事件在其他時(shí)候(如信號(hào)狀態(tài)更改)也很有用,事件通常還是用在圖形用戶界面中。事件通常使用委托事件處理程序進(jìn)行聲明。事件可以調(diào)用匿名方法來(lái)替代委托。,七、C#4.0的新特性,1.大整數(shù)類型BigInteger:是不可變類型,代表一個(gè)任意大的整數(shù),其值在理論上已沒有上部或下部的界限。2.動(dòng)態(tài)數(shù)據(jù)類型dynamic:是C#4.0引入了一個(gè)新的靜態(tài)類型,它會(huì)告訴編譯器,在編譯期不去檢查dynamic類型,而是在運(yùn)行時(shí)才決定。3.命名參數(shù):命名參數(shù)讓我們可以在調(diào)用方法時(shí)指定參數(shù)名字來(lái)給參數(shù)賦值,這種情況下可以忽略參數(shù)的順序。4.可選參數(shù):調(diào)用時(shí)可以為可選的參數(shù)省略參數(shù)值。每個(gè)可選參數(shù)都具有默認(rèn)值作為其定義的一部分,