C#高級(jí)特性,異常,調(diào)試_第1頁(yè)
C#高級(jí)特性,異常,調(diào)試_第2頁(yè)
C#高級(jí)特性,異常,調(diào)試_第3頁(yè)
C#高級(jí)特性,異常,調(diào)試_第4頁(yè)
C#高級(jí)特性,異常,調(diào)試_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 第4章 C#高級(jí)特性,異常,調(diào)試唐大仕本章內(nèi)容n4.1 程序的組織n4.2 委托與事件n4.3 運(yùn)算符重載n4.4 異常處理n4.5 Attributen4.6 C#語(yǔ)言中的其他成分n4.7 程序的調(diào)試4.1 程序的組織n名字空間程序的邏輯組織n嵌套類型類中嵌套類型n程序集程序的物理組織名字空間n1名字空間的概念n邏輯劃分;避免名字沖突n2名字空間的聲明nnamespace xxx.xxxx n可嵌套n3名字空間的導(dǎo)入nusing xxx.xxxx;n4使用別名nusing 別名 = 名字空間或類名;NamespaceUsing.cs嵌套類型n嵌套類型的概念n類型中的類型nclass A p

2、ublic class B public struct C n嵌套類型的可訪問(wèn)性n受各個(gè)層次的限制NestedAccessibility.cs程序集n模塊(module)n程序集(assembly)n在VS.NET上引用程序集n在項(xiàng)目上點(diǎn)右鍵,添加引用csc /target:mod /out:Add.mod Add.cscsc /target:mod /out:Multi.mod Multi.csal /target:library /out: MyLibrary.dll Add.mod Multi.modcsc /target:exe /out:MyClient.exe /reference

3、:MyLibrary.dll MyClient.cs Add.cs Multi.cs Add.mod Multi.mod MyLibrary.dll MyClient.exe MyClient.cs 4.2 委托與事件大致上:委托-函數(shù)指針事件-回調(diào)函數(shù)委托n委托的聲明npublic delegate double MyDelegate ( double x );n委托的實(shí)例化nMyDelegated d2 = new MyDelegate( obj.myMethod );n委托的調(diào)用n委托變量名(參數(shù)列表 ) nd2(8.9)DelegateIntegral.cs委托示例DelegatePl

4、otFun.cs委托的合并n委托的合并-多播MultiCastDelegaten一個(gè)委托實(shí)例中可以“包含”多個(gè)函數(shù)n調(diào)用委托,就是調(diào)用其中多個(gè)函數(shù)n多個(gè)函數(shù)間的先后順序是沒有意義的n運(yùn)算符 + - += -=n動(dòng)態(tài)地增減其中的函數(shù)n提高了程序的靈活性DelegateMultiTest.csDelegate溫度.cs委托的轉(zhuǎn)換與相等n委托的轉(zhuǎn)換n按聲明的名稱判斷n以下兩個(gè)不能互相轉(zhuǎn)換或加減ndelegate void D( int a );ndelegate void E( int a );n委托的相等n按內(nèi)容(即其中“包含的函數(shù)”)來(lái)判斷DelegateEquals.cs事件n事件的聲明npu

5、blic event 委托名 事件名;n事件的注冊(cè)與移除n事件名 += 或 -=n在事件所在類的外面,只能用以上兩個(gè)運(yùn)算符n事件的發(fā)生n事件名(參數(shù)列表)n相當(dāng)于回調(diào)所注冊(cè)的函數(shù)事件與委托的關(guān)系n事件有點(diǎn)像委托類型的實(shí)例n事件一定有相關(guān)的委托類型n與委托實(shí)例一樣,事件也“包含”多個(gè)函數(shù)n事件的運(yùn)算符受更多限制(+=或-=)n事件比委托實(shí)例更復(fù)雜:事件存取器n修飾符 event 委托類型名 事件名nnadd e += value; nremove e -= value; nEventButtonForm.cs使用事件的例子n網(wǎng)絡(luò)爬蟲程序中通知調(diào)用者下載開始、結(jié)束及下載進(jìn)度EventWhenDow

6、nload.cs綜合示例n使用C#多種語(yǔ)法要素(特別是event及Exception)n參見 BankSystem-v1-v2csharp語(yǔ)言新特性與事件nC#2.0 引入泛型nC#3.0 引入Lambda及LinqnC#4.0 更多的動(dòng)態(tài)特性dynmaic泛型(Generic)nList books=new List();nBook book = books0;n/以前要用強(qiáng)制類型轉(zhuǎn)換nArrayList books = new ArrayList();nBook book = (Book) books0;匿名方法ndelegate(參數(shù)) 方法體n可以當(dāng)一個(gè)匿名方法nnew Thread(

7、nnew ThreadStart( delegate() . ) );n可以被隱式轉(zhuǎn)換為一個(gè)兼容的委托類型nnew Thread(delegate() . );Lamda表達(dá)式n相當(dāng)于匿名方法的簡(jiǎn)寫n(參數(shù))=語(yǔ)句或表達(dá)式Linqn常見的形式nfrom c in customers nwhere c.Age10norderby c.Namenselect new c.Name, c.Phonen相當(dāng)于ncustomersn.Where(c= c.Age10)n.OrderBy(c = c.Name).n.Select(c = new c.Name, c.Phone )示例n在不同C#版本中使用

8、delegaten參見:MethodDelegateLamda4.3 運(yùn)算符重載運(yùn)算符n使用運(yùn)算符的例子nthis.Location += new Size(10,10);nTimeSpan diff = date2 date1;nString s1, s2; if( s1=s2)n運(yùn)算符有時(shí)比方法名更直觀n如 兩個(gè)復(fù)數(shù)用 a+b 比 a.Add(b)更直觀n但要慎用n運(yùn)算符重載有一些限制n如成對(duì),如類型要求,如有的不能重載n更詳細(xì)的內(nèi)容,請(qǐng)參見文檔運(yùn)算符的聲明n一元運(yùn)算符聲明的形式如下:npublic static 類型 operator 一元運(yùn)算符 ( 類型 參數(shù)名 ) n二元運(yùn)算符聲明的

9、形式如下:npublic static 類型 operator 二元運(yùn)算符 ( 類型 參數(shù)名,類型 參數(shù)名) n類型轉(zhuǎn)換運(yùn)算符聲明的形式如下:npublic static implicit operator 類型 ( 類型 參數(shù)名) npublic static explicit operator 類型 ( 類型 參數(shù)名) OperatorComplex.cs4.4 異常處理異常處理n異??梢砸詢煞N不同的方式引發(fā):nthrow語(yǔ)句無(wú)條件,即時(shí)的拋出異常。nC#語(yǔ)句和表達(dá)式執(zhí)行過(guò)程中激發(fā)了某個(gè)異常的條件,使得操作無(wú)法正常結(jié)束,從而引發(fā)異常。例如整數(shù)除法操作分母為零時(shí)將拋出一個(gè)異常。n首先介紹一下

10、throw語(yǔ)句。throw語(yǔ)句拋出一個(gè)異常的語(yǔ)法為:nthrow expressionn帶有表達(dá)式的throw語(yǔ)句拋出的異常是在計(jì)算這個(gè)表達(dá)式時(shí)產(chǎn)生的。異常由try語(yǔ)句來(lái)處理的ntry語(yǔ)句提供了一種機(jī)制來(lái)捕捉執(zhí)行過(guò)程中發(fā)生的異常。以下是它的三種可能的形式:ntry-catchntry-finallyntry-catch-finally異常的概念nC#中的異常處理ntry ncatch(Exception e) nfinally nSystem.Exception類npublic Exception();npublic Exception(string s);nMessage屬性nStackTr

11、ace屬性 幾種常用的異常類nSystem.OutOfMemoryExceptionnSystem.StackOverflowExceptionnSystem.NullReferenceExceptionnSystem.TypeInitializationExceptionnSystem.InvalidCastExceptionnSystem.ArrayTypeMismatchExceptionnSystem.IndexOutOfRangeExceptionnSystem.MulticastNotSupportedExceptionnSystem.ArithmeticExceptionnSys

12、tem.DivideByZeroExceptionnSystem.OverflowException捕獲和處理異常n拋出異常nthrow new SomeException();n捕獲異常ntry ncatch(AException e1) ncatch(BException e2) ncatch(更一般的Exception e) nfinally n注:catch表示捕獲所有種類的異常ExceptionIndexOutOf.csExceptionSimple.cs創(chuàng)建用戶自定義異常類n從Exception或ApplicationException繼承n重拋異常nthrows;n異常鏈接nth

13、row new Excepiton( “msg”, e );n這里e稱為內(nèi)部異常nInnerException屬性n使得外部能進(jìn)一步知道內(nèi)部的異常原因ExceptionInner.cs算術(shù)溢出與checkedn對(duì)溢出進(jìn)行檢查n對(duì)整個(gè)程序 csc /checked XXXX.csn對(duì)部分程序n針對(duì)表達(dá)式: checked(表達(dá)式) 及 uncheckd(表達(dá)式)n針對(duì)塊語(yǔ)句: checked 及 uncheckdn對(duì)溢出異常進(jìn)行捕獲ntry catch( OverflowException e ) CheckedTest.cs4.5 Attribute使用Attribute的例子n用在類上的nS

14、erializablenpublic sealed class String : IComparable, Icloneable, IConvertible, Ienumerablen用在方法上的nSTAThreadnstatic void Main()AttributeAttribute是與類、結(jié)構(gòu)、方法等元素相關(guān)的額外信息,是對(duì)元信息的擴(kuò)展。通過(guò)Attribute可以使程序、甚至語(yǔ)言本身的功能得到增強(qiáng)。使用系統(tǒng)定義的Attributen使用Attribute的一般方式n在程序集、類、域、方法等前面用表示n可以省略“Attribute”幾個(gè)字母,只寫xxxxx n可以帶參數(shù)n位置參數(shù) (相當(dāng)

15、于構(gòu)造方法帶的參數(shù))n命名參數(shù)(域名或?qū)傩悦?值)n示例n在Main()方法使用STAThreadn使用“過(guò)時(shí)”:AttributeObsolete.cs n使用“條件”:AttributeConditional.cs n在結(jié)構(gòu)上、枚舉上使用:StructLayout,F(xiàn)lagn在程序集級(jí)別應(yīng)用Attribute nassembly: AssemblyCompany()自定義Attributen1聲明Attribute類n2使用Attribute類n3通過(guò)反射訪問(wèn)屬性AttributeHelp.csnAttributes are classesnAttached to types and me

16、mbersnAttributes can be queried at runtime4.6 C#語(yǔ)言中的其他成分編譯預(yù)處理n1標(biāo)識(shí)符聲明n#define定義一個(gè)標(biāo)識(shí)符;n#undef“取消定義”一個(gè)標(biāo)識(shí)符。n2條件處理n#if, #elif, #else, #endifn3信息報(bào)告n#error 和 #warningn4行號(hào)標(biāo)記n#line 行號(hào) 文件名unsafe及指針n1unsafen用于修飾類、方法等n2fixed及指針nfixed( 類型 * 指針名 = 表達(dá)式 ) 語(yǔ)句n3sizeof運(yùn)算符nsizeof( 簡(jiǎn)單或結(jié)構(gòu)類型名 ) n4stackallocn在棧上分配的內(nèi)存,而不是在堆

17、上,因此不會(huì)擔(dān)心內(nèi)存被垃圾回收器自動(dòng)回收。 UnsafeCopy.csC# And PointersnDevelopers sometime need total controlnPerformance extremesnDealing with existing binary structuresnAdvanced COM Support, DLL ImportnC# “unsafe” = a limited “inline C”nPointer types, pointer arithmeticnUnsafe castsnDeclarative pinning (fixed stateme

18、nt)nC# developers have headroom Unsafe Example其他關(guān)鍵字n1lockn多線程程序中,lock可以將某個(gè)對(duì)象加鎖 n2. volatilen隨時(shí)可能被程序以外的其他因素所修改。域被volatile修飾時(shí),會(huì)阻止編譯器對(duì)它的優(yōu)化。 C#幾個(gè)語(yǔ)法的小結(jié)n類型聲明n類的成員類型聲明n類型聲明是C#程序的主體,它可以位于名字空間中,也可以是嵌套的類型。n類型聲明包括以下幾種:n1) 類 classn2) 結(jié)構(gòu) structn3) 接口 interfacen4) 枚舉 enumn5) 委托 delegate類的成員n1)常數(shù)(const)n它代表了與類相關(guān)的常

19、數(shù)數(shù)據(jù)。n2)域(field)n它是類中的變量。n3)方法(method)n它實(shí)現(xiàn)了可以被類實(shí)現(xiàn)的計(jì)算和行為。n4)屬性(property)n它定義了命名的屬性和與對(duì)這個(gè)屬性進(jìn)行讀寫的相關(guān)行為。n5)事件(event)n它定義了由類產(chǎn)生的通知n6)索引(indexer)n它允許類的實(shí)例通過(guò)與數(shù)組相同的方法來(lái)索引。類的成員(續(xù))n7)運(yùn)算符(operator)n它定義了可以被應(yīng)用于類的實(shí)例上的表達(dá)式運(yùn)算符。n8)實(shí)例構(gòu)造函數(shù)(instance constructor)n它執(zhí)行需要對(duì)類的實(shí)例進(jìn)行初始化的動(dòng)作。n9)析構(gòu)函數(shù)(destructor)n類的實(shí)例被清除時(shí)實(shí)現(xiàn)的動(dòng)作(結(jié)構(gòu)不能有析構(gòu)函數(shù))。

20、n10) 靜態(tài)構(gòu)造函數(shù)(static constructor)n它執(zhí)行對(duì)類本身進(jìn)行初始化的動(dòng)作。n11) 類型(type)n它代表位于類中的類型。4.7 程序的調(diào)試錯(cuò)誤的種類n代碼的錯(cuò)誤通??梢苑殖扇箢恘語(yǔ)法錯(cuò)誤n運(yùn)行錯(cuò)誤n邏輯錯(cuò)誤n其中語(yǔ)法錯(cuò)誤比較容易排除,也是一種低級(jí)的錯(cuò)誤。運(yùn)行錯(cuò)誤和邏輯錯(cuò)誤需要靠經(jīng)驗(yàn)、調(diào)試工具以及不斷的深入代碼來(lái)排除。語(yǔ)法錯(cuò)誤n此類型的錯(cuò)誤通常發(fā)生在程序員對(duì)語(yǔ)言本身的熟悉度不足n如if之后忘了加上大括號(hào)、For語(yǔ)句少了分號(hào)。還有比如定義一個(gè)變量是Student,但是在引用的時(shí)候不小心就變成studnet了。還有一種情況是調(diào)用函數(shù)錯(cuò)誤的語(yǔ)法。n例如調(diào)用SubString函數(shù)少傳了一個(gè)參數(shù)。使用Visual Studio.NET開發(fā)工具,多數(shù)的錯(cuò)誤會(huì)在編輯程序的時(shí)候發(fā)現(xiàn)。邏輯錯(cuò)誤n邏輯錯(cuò)誤(Logic Error)是指程序算法的錯(cuò)誤,這種錯(cuò)誤程序不會(huì)發(fā)生任何程序中斷或跳出程

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論