《DotNet技术培训(共53张).pptx》由会员分享,可在线阅读,更多相关《DotNet技术培训(共53张).pptx(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 第4章 C#高级特性,异常,调试本章内容n4.1 程序的组织n4.2 委托与事件n4.3 操作符重载n4.4 异常处理n4.5 Attributen4.6 C#语言中的其他成分n4.7 程序的调试4.1 程序的组织n名字空间程序的逻辑组织n嵌套类型类中嵌套类型n程序集程序的物理组织名字空间n1名字空间的概念n逻辑划分;避免名字冲突n2名字空间的声明nnamespace xxx.xxxx n可嵌套n3名字空间的导入nusing xxx.xxxx;n4使用别名nusing 别名 = 名字空间或类名;NamespaceUsing.cs嵌套类型n嵌套类型的概念n类型中的类型nclass A publ
2、ic class B public struct C nnew A.B.C();n嵌套类型的可访问性n受各个层次的限制NestedAccessibility.cs程序集n模块(module)n程序集(assembly)n在VS.NET上引用程序集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
3、/reference:MyLibrary.dll MyClient.cs Add.cs Multi.cs Add.mod Multi.mod MyLibrary.dll MyClient.exe MyClient.cs 4.2 委托与事件大致上:委托-函数指针事件-回调函数委托n委托的声明npublic delegate double MyDelegate ( double x );n委托的实例化nMyDelegated d2 = new MyDelegate( obj.myMethod );n委托的调用n委托变量名(参数列表 ) nd2(8.9)DelegateIntegral.cs委托示例
4、DelegatePlotFun.cs委托的合并n委托的合并-多播MultiCastDelegaten一个委托实例中可以“包含”多个函数n调用委托,就是调用其中多个函数n多个函数间的先后顺序是没有意义的n运算符 + - += -=n动态地增减其中的函数n提高了程序的灵活性DelegateMultiTest.csDelegate温度.cs委托的转换与相等n委托的转换n按声明的名称判断n以下两个不能互相转换或加减ndelegate void D( int a );ndelegate void E( int a );n委托的相等n按内容(即其中“包含的函数”)来判断DelegateEquals.cs事
5、件n事件的声明npublic event 委托名 事件名;n事件的注册与移除n事件名 += 或 -=n在事件所在类的外面,只能用以上两个运算符n事件的发生n事件名(参数列表)n相当于回调所注册的函数事件与委托的关系n事件有点像委托类型的实例n事件一定有相关的委托类型n与委托实例一样,事件也“包含”多个函数n事件的运算符受更多限制(+=或-=)n事件比委托实例更复杂:事件存取器n修饰符 event 委托类型名 事件名nnadd e += value; nremove e -= value; nEventButtonForm.cs使用事件的例子n网络爬虫程序中通知调用者下载开始、结束及下载进度Ev
6、entWhenDownload.cs4.3 操作符重载操作符重载的概念n操作符有时比方法名更直观n如 两个复数用 a+b 比 a.Add(b)更直观n但要慎用n操作符重载有一些限制n如成对,如类型要求,如有的不能重载n更详细的内容,请参见文档操作符的声明n一元操作符声明的形式如下:npublic static 类型 operator 一元操作符 ( 类型 参数名 ) n二元操作符声明的形式如下:npublic static 类型 operator 二元操作符 ( 类型 参数名,类型 参数名) n类型转换操作符声明的形式如下:npublic static implicit operator 类型
7、 ( 类型 参数名) npublic static explicit operator 类型 ( 类型 参数名) OperatorComplex.cs4.4 异常处理异常处理n异常可以以两种不同的方式引发:nthrow语句无条件,即时的抛出异常。nC#语句和表达式执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常。例如整数除法操作分母为零时将抛出一个异常。n首先介绍一下throw语句。throw语句抛出一个异常的语法为:nthrow expressionn带有表达式的throw语句抛出的异常是在计算这个表达式时产生的。异常由try语句来处理的ntry语句提供了一种机制来捕捉执行
8、过程中发生的异常。以下是它的三种可能的形式:ntry-catchntry-finallyntry-catch-finally异常的概念nC#中的异常处理ntry ncatch(Exception e) nfinally nSystem.Exception类npublic Exception();npublic Exception(string s);nMessage属性nStackTrace属性 几种常用的异常类nSystem.OutOfMemoryExceptionnSystem.StackOverflowExceptionnSystem.NullReferenceExceptionnSys
9、tem.TypeInitializationExceptionnSystem.InvalidCastExceptionnSystem.ArrayTypeMismatchExceptionnSystem.IndexOutOfRangeExceptionnSystem.MulticastNotSupportedExceptionnSystem.ArithmeticExceptionnSystem.DivideByZeroExceptionnSystem.OverflowException捕获和处理异常n抛出异常nthrow new SomeException();n捕获异常ntry ncatch(
10、AException e1) ncatch(BException e2) ncatch(更一般的Exception e) nfinally n注:catch表示捕获所有种类的异常ExceptionIndexOutOf.csExceptionSimple.cs创建用户自定义异常类n从Exception或ApplicationException继承n重抛异常nthrows;n异常链接nthrow new Excepiton( “msg”, e );n这里e称为内部异常nInnerException属性n使得外部能进一步知道内部的异常原因ExceptionInner.cs算术溢出与checkedn对
11、溢出进行检查n对整个程序 csc /checked XXXX.csn对部分程序n针对表达式: checked(表达式) 及 uncheckd(表达式)n针对块语句: checked 及 uncheckdn对溢出异常进行捕获ntry catch( OverflowException e ) CheckedTest.cs4.5 AttributeAttributeAttribute是与类、结构、方法等元素相关的额外信息,是对元信息的扩展。通过Attribute可以使程序、甚至语言本身的功能得到增强。使用系统定义的Attributen使用Attribute的一般方式n在程序集、类、域、方法等前面用表
12、示n可以省略“Attribute”几个字母,只写xxxxx n可以带参数n位置参数 (相当于构造方法带的参数)n命名参数(域名或属性名=值)n示例n在Main()方法使用STAThreadn使用“过时”:AttributeObsolete.cs n使用“条件”:AttributeConditional.cs n在结构上、枚举上使用:StructLayout,Flagn在程序集级别应用Attribute nassembly: AssemblyCompany()自定义Attributen1声明Attribute类n2使用Attribute类n3通过反射访问属性AttributeHelp.csnAt
13、tributes are classesnAttached to types and membersnAttributes can be queried at runtime4.6 C#语言中的其他成分编译预处理n1标识符声明n#define定义一个标识符;n#undef“取消定义”一个标识符。n2条件处理n#if, #elif, #else, #endifn3信息报告n#error 和 #warningn4行号标记n#line 行号 文件名unsafe及指针n1unsafen用于修饰类、方法等n2fixed及指针nfixed( 类型 * 指针名 = 表达式 ) 语句n3sizeof运算符ns
14、izeof( 简单或结构类型名 ) n4stackallocn在栈上分配的内存,而不是在堆上,因此不会担心内存被垃圾回收器自动回收。 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 arithmeticnUn
15、safe castsnDeclarative pinning (fixed statement)nC# developers have headroom Unsafe Example其他关键字n1lockn多线程程序中,lock可以将某个对象加锁 n2. volatilen随时可能被程序以外的其他因素所修改。域被volatile修饰时,会阻止编译器对它的优化。 C#几个语法的小结n类型声明n类的成员类型声明n类型声明是C#程序的主体,它可以位于名字空间中,也可以是嵌套的类型。n类型声明包括以下几种:n1) 类 classn2) 结构 structn3) 接口 interfacen4) 枚举 e
16、numn5) 委托 delegate类的成员n1)常数(const)n它代表了与类相关的常数数据。n2)域(field)n它是类中的变量。n3)方法(method)n它实现了可以被类实现的计算和行为。n4)属性(property)n它定义了命名的属性和与对这个属性进行读写的相关行为。n5)事件(event)n它定义了由类产生的通知n6)索引(indexer)n它允许类的实例通过与数组相同的方法来索引。类的成员(续)n7)操作符(operator)n它定义了可以被应用于类的实例上的表达式操作符。n8)实例构造函数(instance constructor)n它执行需要对类的实例进行初始化的动作。
17、n9)析构函数(destructor)n类的实例被清除时实现的动作(结构不能有析构函数)。n10) 静态构造函数(static constructor)n它执行对类本身进行初始化的动作。n11) 类型(type)n它代表位于类中的类型。4.7 程序的调试错误的种类n代码的错误通常可以分成三大类n语法错误n运行错误n逻辑错误n其中语法错误比较容易排除,也是一种低级的错误。运行错误和逻辑错误需要靠经验、调试工具以及不断的深入代码来排除。语法错误n此类型的错误通常发生在程序员对语言本身的熟悉度不足n如if之后忘了加上大括号、For语句少了分号。还有比如定义一个变量是Student,但是在引用的时候不
18、小心就变成studnet了。还有一种情况是调用函数错误的语法。n例如调用SubString函数少传了一个参数。使用Visual Studio.NET开发工具,多数的错误会在编辑程序的时候发现。逻辑错误n逻辑错误(Logic Error)是指程序算法的错误,这种错误程序不会发生任何程序中断或跳出程序,而是一直执行到最后,可能有结果。但是执行结果是不对的。n如计算1到10的总数,结果应该为55,利用下面的算法。运行时错误n运行时错误(Runtime Error)多数发生在不可预期的异常。n比如打开硬盘上的某个文件时,该文件不存在。向硬盘上写某个文件的时候,硬盘的空间不足。n由于网络阻塞得不到预期的
19、数据等等。也有可能是用户不按正确的操作步骤而造成的错误,n如在做除法的时候除数为零,访问数组的时候,超出了可访问下标的范围,这些都是发生错误的原因。比如下面的代码。程序调试的基本手段n断点n跟踪n监视断点n断点n用鼠标单击左边 Ctrl+Bn调试|窗口|断点 Ctrl+Alt+F9n断点的属性n条件断点(先设置断点,右击,可编辑条件)n命中次数n清除或禁用断点n清除所有断点 Ctrl+Shift+F9跟踪n单步执行n逐语句 F11n逐过程 F10n点右键,运行到光标处n跳出函数n拖动到下一句监视n即时监视n快速监视 Ctrl+Alt+Qn自动窗口n调用堆栈n指令n调试|窗口|反汇编练习n1.练习C#语言中的几个高级特性n参见ch04下的示例n2.练习异常的处理n3.练习调试n参见forDebug下的示例nwhile循环的跟踪n数组的跟踪(筛法求素数)n构造方法执行过程的跟踪n一个dotNET BUG的跟踪进一步阅读n电子稿C#语言高级特性.docn文章The Code Project Exception Handling Best Practices in _NET - _NET.htm问题与讨论演讲完毕,谢谢观看!
限制150内