《C#高级特性.ppt》由会员分享,可在线阅读,更多相关《C#高级特性.ppt(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 第4章 C#高级特性,异常,调试唐大仕http:/本章内容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
2、 A public 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/re
3、ference:MyLibrary.dll MyClient.cs4.2 委托与事件大致上:委托-函数指针事件-回调函数委托n委托的声明npublic delegate double MyDelegate(double x);n委托的实例化nMyDelegated d2=new MyDelegate(obj.myMethod);n委托的调用n委托变量名(参数列表)nd2(8.9)DelegateIntegral.cs委托示例DelegatePlotFun.cs委托的合并n委托的合并-多播MultiCastDelegaten一个委托实例中可以“包含”多个函数n调用委托,就是调用其中多个函数n多个
4、函数间的先后顺序是没有意义的n运算符 +-+=-=n动态地增减其中的函数n提高了程序的灵活性DelegateMultiTest.csDelegate温度.cs委托的转换与相等n委托的转换n按声明的名称判断n以下两个不能互相转换或加减ndelegate void D(int a);ndelegate void E(int a);n委托的相等n按内容(即其中“包含的函数”)来判断DelegateEquals.cs事件n事件的声明npublic event 委托名 事件名;n事件的注册与移除n事件名+=或-=n在事件所在类的外面,只能用以上两个运算符n事件的发生n事件名(参数列表)n相当于回调所注册
5、的函数事件与委托的关系n事件有点像委托类型的实例n事件一定有相关的委托类型n与委托实例一样,事件也“包含”多个函数n事件的运算符受更多限制(+=或-=)n事件比委托实例更复杂:事件存取器n修饰符 event 委托类型名 事件名nnadd e+=value;nremove e-=value;nEventButtonForm.cs使用事件的例子n网络爬虫程序中通知调用者下载开始、结束及下载进度EventWhenDownload.cs4.3 操作符重载操作符重载的概念n操作符有时比方法名更直观n如 两个复数用 a+b 比 a.Add(b)更直观n但要慎用n操作符重载有一些限制n如成对,如类型要求,如
6、有的不能重载n更详细的内容,请参见文档操作符的声明n一元操作符声明的形式如下:npublic static 类型 operator 一元操作符(类型 参数名)n二元操作符声明的形式如下:npublic static 类型 operator 二元操作符(类型 参数名,类型 参数名)n类型转换操作符声明的形式如下:npublic static implicit operator 类型(类型 参数名)npublic static explicit operator 类型(类型 参数名)OperatorComplex.cs4.4 异常处理异常处理n异常可以以两种不同的方式引发:nthrow语句无条件,
7、即时的抛出异常。nC#语句和表达式执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常。例如整数除法操作分母为零时将抛出一个异常。n首先介绍一下throw语句。throw语句抛出一个异常的语法为:nthrow expressionn带有表达式的throw语句抛出的异常是在计算这个表达式时产生的。异常由try语句来处理的ntry语句提供了一种机制来捕捉执行过程中发生的异常。以下是它的三种可能的形式:ntry-catchntry-finallyntry-catch-finally异常的概念nC#中的异常处理ntry ncatch(Exception e)nfinally nSyste
8、m.Exception类npublic Exception();npublic Exception(string s);nMessage属性nStackTrace属性 几种常用的异常类nSystem.OutOfMemoryExceptionnSystem.StackOverflowExceptionnSystem.NullReferenceExceptionnSystem.TypeInitializationExceptionnSystem.InvalidCastExceptionnSystem.ArrayTypeMismatchExceptionnSystem.IndexOutOfRange
9、ExceptionnSystem.MulticastNotSupportedExceptionnSystem.ArithmeticExceptionnSystem.DivideByZeroExceptionnSystem.OverflowException捕获和处理异常n抛出异常nthrow new SomeException();n捕获异常ntry ncatch(AException e1)ncatch(BException e2)ncatch(更一般的Exception e)nfinally n注:catch表示捕获所有种类的异常ExceptionIndexOutOf.csExceptio
10、nSimple.cs创建用户自定义异常类n从Exception或ApplicationException继承n重抛异常nthrows;n异常链接nthrow new Excepiton(“msg”,e);n这里e称为内部异常nInnerException属性n使得外部能进一步知道内部的异常原因ExceptionInner.cs算术溢出与checkedn对溢出进行检查n对整个程序 csc /checked XXXX.csn对部分程序n针对表达式:checked(表达式)及 uncheckd(表达式)n针对块语句:checked 及 uncheckdn对溢出异常进行捕获ntry catch(Ove
11、rflowException e)CheckedTest.cs4.5 AttributeAttributeHelpUrl(“http:/SomeUrl/APIDocs/SomeClass”)HelpUrl(“http:/SomeUrl/APIDocs/SomeClass”)class SomeClassclass SomeClass WebMethod WebMethod void GetCustomers()void GetCustomers()string Test(SomeAttr string param1)string Test(SomeAttr string param1)Attr
12、ibute是与类、结构、方法等元素相关的额外信息,是对元信息的扩展。通过Attribute可以使程序、甚至语言本身的功能得到增强。使用系统定义的Attributen使用Attribute的一般方式n在程序集、类、域、方法等前面用表示n可以省略“Attribute”几个字母,只写xxxxx n可以带参数n位置参数(相当于构造方法带的参数)n命名参数(域名或属性名=值)n示例n在Main()方法使用STAThreadn使用“过时”:AttributeObsolete.cs n使用“条件”:AttributeConditional.cs n在结构上、枚举上使用:StructLayout,Flagn在
13、程序集级别应用Attribute nassembly:AssemblyCompany()自定义Attributen1声明Attribute类n2使用Attribute类n3通过反射访问属性AttributeHelp.csnAttributes are classesnAttached to types and membersnAttributes can be queried at runtimeclass HelpUrlAttribute:System.Attribute class HelpUrlAttribute:System.Attribute public HelpUrlAttrib
14、ute(string url)public HelpUrlAttribute(string url)HelpUrl(“http:/SomeUrl/APIDocs/SomeClass”)HelpUrl(“http:/SomeUrl/APIDocs/SomeClass”)class SomeClass class SomeClass Type type=Type.GetType(“SomeClass”);Type type=Type.GetType(“SomeClass”);object attributes=type.GetCustomAttributes();object attributes
15、=type.GetCustomAttributes();4.6 C#语言中的其他成分编译预处理n1标识符声明n#define定义一个标识符;n#undef“取消定义”一个标识符。n2条件处理n#if,#elif,#else,#endifn3信息报告n#error 和#warningn4行号标记n#line 行号 文件名unsafe及指针n1unsafen用于修饰类、方法等n2fixed及指针nfixed(类型*指针名=表达式)语句n3sizeof运算符nsizeof(简单或结构类型名)n4stackallocn在栈上分配的内存,而不是在堆上,因此不会担心内存被垃圾回收器自动回收。UnsafeC
16、opy.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 statement)nC#developers have headroom Unsafe
17、 Exampleclass FileStream:Streamclass FileStream:Streamclass FileStream:Streamclass FileStream:Stream int handle;int handle;int handle;int handle;dllimport(kernel32,SetLastError=true)dllimport(kernel32,SetLastError=true)dllimport(kernel32,SetLastError=true)dllimport(kernel32,SetLastError=true)static
18、extern unsafe bool ReadFile(int hFile,static extern unsafe bool ReadFile(int hFile,static extern unsafe bool ReadFile(int hFile,static extern unsafe bool ReadFile(int hFile,void*lpBuffer,int nBytesToRead,void*lpBuffer,int nBytesToRead,void*lpBuffer,int nBytesToRead,void*lpBuffer,int nBytesToRead,int
19、*nBytesRead,Overlapped*lpOverlapped);int*nBytesRead,Overlapped*lpOverlapped);int*nBytesRead,Overlapped*lpOverlapped);int*nBytesRead,Overlapped*lpOverlapped);public unsafe int Read(byte buffer,int index,int count)public unsafe int Read(byte buffer,int index,int count)public unsafe int Read(byte buffe
20、r,int index,int count)public unsafe int Read(byte buffer,int index,int count)int n=0;int n=0;int n=0;int n=0;fixed(byte*p=buffer)fixed(byte*p=buffer)fixed(byte*p=buffer)fixed(byte*p=buffer)ReadFile(handle,p+index,count,&n,null);ReadFile(handle,p+index,count,&n,null);ReadFile(handle,p+index,count,&n,
21、null);ReadFile(handle,p+index,count,&n,null);return n;return n;return n;return n;其他关键字n1lockn多线程程序中,lock可以将某个对象加锁 n2.volatilen随时可能被程序以外的其他因素所修改。域被volatile修饰时,会阻止编译器对它的优化。C#几个语法的小结n类型声明n类的成员类型声明n类型声明是C#程序的主体,它可以位于名字空间中,也可以是嵌套的类型。n类型声明包括以下几种:n1)类 classn2)结构 structn3)接口 interfacen4)枚举 enumn5)委托 delegat
22、e类的成员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它执行需要对类的实例进行初始化的动作。n9)析构函数(destructo
23、r)n类的实例被清除时实现的动作(结构不能有析构函数)。n10)静态构造函数(static constructor)n它执行对类本身进行初始化的动作。n11)类型(type)n它代表位于类中的类型。4.7 程序的调试错误的种类n代码的错误通常可以分成三大类n语法错误n运行错误n逻辑错误n其中语法错误比较容易排除,也是一种低级的错误。运行错误和逻辑错误需要靠经验、调试工具以及不断的深入代码来排除。语法错误n此类型的错误通常发生在程序员对语言本身的熟悉度不足n如if之后忘了加上大括号、For语句少了分号。还有比如定义一个变量是Student,但是在引用的时候不小心就变成studnet了。还有一种情
24、况是调用函数错误的语法。n例如调用SubString函数少传了一个参数。使用Visual Studio.NET开发工具,多数的错误会在编辑程序的时候发现。逻辑错误n逻辑错误(Logic Error)是指程序算法的错误,这种错误程序不会发生任何程序中断或跳出程序,而是一直执行到最后,可能有结果。但是执行结果是不对的。n如计算1到10的总数,结果应该为55,利用下面的算法。运行时错误n运行时错误(Runtime Error)多数发生在不可预期的异常。n比如打开硬盘上的某个文件时,该文件不存在。向硬盘上写某个文件的时候,硬盘的空间不足。n由于网络阻塞得不到预期的数据等等。也有可能是用户不按正确的操作
25、步骤而造成的错误,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问题与讨论