06面向对象高级特性_xm (2)

上传人:博****1 文档编号:569311337 上传时间:2024-07-28 格式:PPT 页数:69 大小:2.02MB
返回 下载 相关 举报
06面向对象高级特性_xm (2)_第1页
第1页 / 共69页
06面向对象高级特性_xm (2)_第2页
第2页 / 共69页
06面向对象高级特性_xm (2)_第3页
第3页 / 共69页
06面向对象高级特性_xm (2)_第4页
第4页 / 共69页
06面向对象高级特性_xm (2)_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《06面向对象高级特性_xm (2)》由会员分享,可在线阅读,更多相关《06面向对象高级特性_xm (2)(69页珍藏版)》请在金锄头文库上搜索。

1、C#高级编程调试调试应用程序开发可以安装在客户端机器上应用程序必须无错误无故障可靠稳健查找和排除查找和排除错误或故障称为错误或故障称为调试调试调试的必要性调试的必要性 在事物处理过程中,系统显示错误消息在事物处理过程中,系统显示错误消息系统发生故障系统发生故障必须重新输入全部信息在部署应用程序前必须先对其进行调试在部署应用程序前必须先对其进行调试错误类型错误类型错误类型语法错误逻辑错误运行时错误l语法错误、缺少括号等l在编译时确定l易于确定l错误的算法导致错误结果、公式错误等l在执行过程中确定l难以调试l内存泄漏、以零作除数、异常l在运行时确定l难以调试调试过程调试过程调试器观察程序的运行时行

2、为跟踪变量的值确定语义错误的位置查看寄存器的内容查看内存空间调试过程调试过程暂停暂停可在代码中插入“断点”,以便在特定行处暂停执行该代码调试过程调试过程右键单击所需代码行,以设置断点选择“插入断点”调试过程调试过程选择“调试”“继续”以便继续执行程序调试过程调试过程.NET集成开发环境Debug模式Release模式 VS.NET 中的调试工具中的调试工具“局部变量”窗口 VS.NET 中的调试工具中的调试工具“监视”窗口 VS.NET 的调试工具的调试工具 “快速监视”对话框 VS.NET 中的调试工具中的调试工具 “即时”窗口 VS.NET 中的调试工具中的调试工具 跨语言调试调试使用.N

3、ET框架编写的应用程序以及Win32本机应用程序加入正在运行的程序调试多个程序VisualStudio.NET调试器的功能异常异常帐户帐户姓名姓名 余额余额300123小王300124小黄7000311320小李网上银行网上银行某学生小王转帐5000到其朋友小李的帐面上04500数据库系统将查询发送到数据库中系统将查询发送到数据库中tranfer_money()sendquery(); . .余额4500-5000 程序崩溃程序崩溃拒绝交易拒绝交易错误错误 系统出现故障系统出现故障“C#”中的异常C# 中的异常处理中的异常处理.INPUTDivisorIFDivisor=0THENResult

4、=Divident/Divisor.代码片段1输入除数结果 =_0 24GOTOPREVIOUSLINE触发异常处理程序 C# 中的异常处理中的异常处理.INPUTDivisorResult=Divident/Divisor.代码片段1“用户自定义”错误检查机制难以检查输入的任何难以检查输入的任何“特殊字符特殊字符”IFDivisor=0THENGOTOPREVIOUSLINEIFDivisor0THENPRINT“无效输入”运行库运行库运行库应当提供“错误检查机制”错误与异常错误与异常l错误:可预见,如信用卡号格式不对或口令不对。可由程序代码进行排除。l异常:与程序无关的外部原因造成。如数据

5、表不可用或硬件故障等。System.Exception System.Exception 属性属性Message获取描述当前异常的消息。Source获取或设置导致错误的应用程序或对象的名称(程序集的名称)。TargetSite获取引发当前异常的方法。StackTrace获取当前异常发生时调用堆栈上的帧的字符串表示形式。System.Exception 在C#程序中,引发异常共有以下两种方式l使用显式throw语句来引发异常。在此情况下,控制权将无条件转到处理异常的部分代码l使用语句或表达式在执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常Try.Catch.Finallytr

6、y 和和 catch 块块 滤水器滤水器filter_water()trywater();catchimpurities.Show(); . .过滤水杂质/程序代码 /错误处理代码 try/程序代码catch(IOExceptionE)/错误处理代码try 和和 catch 块块 try/程序代码catch(IOExceptionE)/错误处理代码引发I/O设备异常try 和和 catch 块块 try/程序代码catch(E)/错误处理代码可处理系统中的任何一种异常System.Exceptiontry 和和 catch 块块 if(grade150)thrownewInvalidNumbe

7、rInput(grade+“不是合法的成绩”);throw可用来引发自定义异常“InvalidNumberInput”使用使用 finallytry/程序代码catch/错误处理代码finally/finally代码无论有否异常该代码都会执行多重多重 catch 块块 try/程序代码catch(IOExceptionE)/错误处理代码catch(OutOfMemoryExceptionE)/错误处理代码用于捕捉两种异常的“catch”块usingSystem;publicclassTestExceppublicstaticintCalc(intj)return100/j;classMyApp

8、publicstaticvoidMain()TestExcepexTest=newTestExcep();tryintdZero=TestExcep.Calc(0);Console.WriteLine(Result:0,dZero);catch(DivideByZeroExceptionex)Console.WriteLine(ex.Message:0,ex.Message);Console.WriteLine(ex.Source:0,ex.Source);Console.WriteLine(ex.TargetSite:0,ex.TargetSite.ToString();Console.Wr

9、iteLine(ex.StackTrace:0,ex.StackTrace);catch(Exceptionex)Console.WriteLine(General+ex.Message);finallyConsole.WriteLine(Cleanupoccurshere);ex.Message: 试图除以零。试图除以零。ex.Source: 005ex.TargetSite: Int32 Calc(Int32)ex.StackTrace: 在在 TestExcep.Calc(Int32 j) 位置位置 E:我的桌面临时文件夹我的桌面临时文件夹实验编程实验编程C Sharp005Progra

10、m.cs: 行号行号 96 在在 MyApp.Main() 位置位置 E:我的桌面临时文件夹我的桌面临时文件夹实验编程实验编程C Sharp005Program.cs:行号行号 107Cleanup occurs here请按任意键继续请按任意键继续. . .如何创建定制异常类如何创建定制异常类usingSystem;publicclassNoDescException:ApplicationExceptionpublicNoDescException()publicNoDescException(stringmessage):base(message)publicNoDescExceptio

11、n(stringmessage,ExceptioninnerEx):base(message,innerEx)publicinterfaceIFun1stringShowMe();publicinterfaceIFun2stringShowMe();classCircle:IFun1publicstringShowMe()returnCircle-IFun1;publicclassObjShowMepublicstaticvoidShowMe(objectobj)if(!(objisIFun1&objisIFun2)thrownewNoDescException(Interfacenotimp

12、lementedfor+obj.ToString();publicclassMyAppstaticvoidMain()CirclemyCir=newCircle();tryObjShowMe.ShowMe(myCir);catch(NoDescExceptionex)Console.WriteLine(ex.Message);未处理异常未处理异常l当CLR找不到处理异常的catch过滤器时usingSystem;classMyApppublicstaticvoidMain()tryintdZero=1/0;finallyConsole.WriteLine(“finally);定制处理未处理异常

13、定制处理未处理异常l终止应用程序之前记录有关异常的信息。如果有足够的有关应用程序状态的信息,则可以采取其他措施,如保存程序数据以便于以后进行恢复。l建议谨慎行事,因为未处理异常时可能会损坏程序数据。l没有通用的方法适用于所有C#程序。lWindows窗体应用:Applicatioin.ThreadException+=newThreadExceptionEventHandler(method);lWindows控制台应用:Thread.GetDomain().UnhandledException+=newUnhandledExceptionEventHandler(method);using

14、System;public class TestExcep public static int Calc(int j) return 100/j; public class UnForgiven public static void MyUnhandleMethod(object sender, UnhandledExceptionEventArgs e) #if DEBUG Console.WriteLine(Debug: + e.ToString();#else Console.WriteLine(Release: + e.ToString();#endif class MyApp pub

15、lic static void Main() Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(UnForgiven.MyUnhandleMethod); try int dZero = TestExcep.Calc(0);finally Console.WriteLine(a); s定制类中实现定制类中实现System.Object方法方法lToString():默认情况下,返回类名。应覆盖此方法,显示出对象与访类其他实例不同的特有内容。lEquals():定制类需定义“相等”的含义:可能两

16、个对象有相同的字段值变相等,也可能引用了相同的内存地址才相等。定制定制ToString()l默认返回.l定制ToString方法实例:usingSystem.Text;usingSystem;publicclassChairprivatedoublemyPrice;privatestringmyVendor,myID;publicChair(doubleprice,stringvendor,stringsku)myPrice=price;myVendor=vendor;myID=sku;publicoverridestringToString()StringBuilderchairSB=new

17、StringBuilder();chairSB.AppendFormat(ITEM=Chair);chairSB.AppendFormat(tVENDOR=0,myVendor);chairSB.AppendFormat(tPRICE=0,myPrice.ToString();returnchairSB.ToString();staticvoidMain()ChairmyChair=newChair(120.0,Broyhill,60-1222);Console.WriteLine(myChair.ToString();定制定制Equals()l比较两个引用类型的对象时,当它们指向相同的对象,

18、返回true。l如果基于值来比较对象时,必须覆盖该方法。String类就是这样一个例子,其虽然是引用类型,但它会基于字符串中的字符串完成比较。using System;public class Chair private double myPrice; private string myVendor, myID; public Chair(double price, string vendor, string sku) myPrice = price; myVendor = vendor; myID = sku; public override bool Equals(object obj)

19、if (obj = null) return false; if (this.GetType() != obj.GetType() return false; Chair otherObj = (Chair)obj; if (!myVendor.Equals(otherObj.myVendor) return false; if (!myPrice.Equals(otherObj.myPrice) return false; if (!myID.Equals(otherObj.myID) return false; return true; public override int GetHas

20、hCode() return myID.GetHashCode(); static void Main() Chair myChair = new Chair(120.0, Broyhill, 60-1222); Chair newChair = new Chair(120.0, Broyhill, 60-1222); bool eq = myChair.Equals(newChair); Console.WriteLine(eq.ToString(); 覆盖覆盖GetHashCode()lGetHashCode方法为对象生成一个Int32类型的散列码。.NET要求两个相同的对象必须有相同的散

21、列码,不同的对象不保证有不同的散列码。lEquals方法必须和GetHashCode方法成对出现。克隆来创建对象副本克隆来创建对象副本lObject中的MemberwiseClone():默认返回对象的一个副本,是一种浅拷贝。l可以实现自已的克隆方法进行深拷贝。l不能克隆基本类型。可克隆的类必须实现ICloneable接口。publicinterfaceICloneableObjectClone();using System;public class Chair : ICloneable private double myPrice; private string myVendor, myID

22、; public Upholstery myUpolstery; public Chair(double price, string vendor, string sku) myPrice = price; myVendor = vendor; myID = sku; public Object Clone() return MemberwiseClone(); public class Upholstery public string fabric; public Upholstery(string fab) fabric = fab; class MyApp static void Mai

23、n() Chair myChair = new Chair(120.0, Broyhill, 60-1222); Chair chairClone = (Chair)myChair.Clone(); bool isEqual; isEqual = Object.ReferenceEquals(myChair, chairClone); Console.WriteLine(isEqual.ToString(); isEqual = Object.ReferenceEquals(myChair.myUpolstery, chairClone.myUpolstery); Console.WriteL

24、ine(isEqual.ToString(); 什么是序列化什么是序列化Profile对象对象界面语言界面语言:英语英语 RssFeed对象对象 存储存储介质介质存储存储序列化是将对象的状态存储到特定存储介质中的过程序列化是将对象的状态存储到特定存储介质中的过程 代理服务器代理服务器 特性特性Serializableabstract class FeedBase标识这个类是可标识这个类是可序列化的序列化的可序列化就是这个类的一个可序列化就是这个类的一个特性特性l描述性关键字l对程序中的元素如:类、字段、方法、属性l命名时以Attribute结尾:SerializableAttributel使用

25、时省略Attributepublic sealed class SerializableAttribute 特性其实是特性其实是一个类一个类l可在类成员附加NonSerialized属性,将其排除在串行化范围之外。publicclassChairNonSerializedpublicdoublemyPrice;publicstringmyVendor,myID;publicChair()publicChair(doubleprice,stringvendor,stringsku)myPrice=price;myVendor=vendor;myID=sku;l使用序列化使用序列化fileStre

26、am = new FileStream(profile.bin, FileMode.Create);BinaryFormatter bf = new BinaryFormatter();bf.Serialize(fileStream, Profile);Serializableabstract class FeedBasel要存储的对象标记为可序列化,包括他的父类和属性的类l使用二进制方式存储对象二进制格式化器二进制格式化器将对象以二进制方将对象以二进制方式格式化为流式格式化为流Serialize ( Stream serializationStream, Object graph) 流流对象

27、对象Serialize的用法的用法:序列化的过程序列化的过程格式化程序格式化程序 对象可否序列化对象可否序列化子类成员子类成员可否序列化可否序列化将对象格式化将对象格式化写入存储介质写入存储介质异常退出异常退出序列化对象中的子类成员YYNN反序列化反序列化l把Profile对象存储成文件,怎么取出来呢?读取读取反序列化则是从特定存储介质中的数据重新构建对象的过程反序列化则是从特定存储介质中的数据重新构建对象的过程 存储存储介质介质Profile对象对象界面语言界面语言:英语英语 RssFeed对象对象 代理服务器代理服务器 数据转换为对象数据转换为对象使用反序列化使用反序列化将序列化好的将序列

28、化好的Profile数据反序列化为对象数据反序列化为对象fileStream = new FileStream(profile.bin, FileMode.Open);BinaryFormatter bf = new BinaryFormatter();Profile = (Profile)bf.Deserialize(fileStream); 将指定流反序列化将指定流反序列化类型转换类型转换public Object Deserialize ( Stream serializationStream ) Deserialize的用法的用法:流流对象对象需要类型转换需要类型转换using Sys

29、tem;using System.Runtime.Serialization.Formatters.Binary;using System.IO;Serializablepublic class Chair public double myPrice; public string myVendor, myID; public Chair() public Chair(double price, string vendor, string sku) myPrice = price; myVendor = vendor; myID = sku; class MyApp static void Ma

30、in() Chair myChair = new Chair(100.0, Broyhill, 10-09); FileStream fs = new FileStream(C:chairs.dat, FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, myChair); fs.Close(); Chair newChair = new Chair(); fs = new FileStream(C:chairs.dat, FileMode.Open); newChair = (Chair)

31、bf.Deserialize(fs); Console.WriteLine(newChair.myPrice.ToString() + + newChair.myVendor + + newChair.myID); 串行化事件串行化事件事件属性OnSerializingOnSerializingOnSerializedOnSerializedOnDeSerializingOnDesializingOnDeSerializedOnDeSerialized这些事件处理程序在被串行化的对象中实现,必须满足以这些事件处理程序在被串行化的对象中实现,必须满足以下两个要求:下两个要求:必须为方法附加与事件

32、相关的属性必须为方法附加与事件相关的属性方法必须有以下签名:方法必须有以下签名:void (StreamingContext context)例如:例如:OnDeSerializedvoid OnMyDeserialized(StringContext context) 注:需加上注:需加上using System.Runtime.Serialization; 处理串行化对象的版本变化处理串行化对象的版本变化l如果删除了原对象的一个字段,格式化器只是忽略逆串行化流中的多余数据。SerializablepublicclassChairpublicdoublemyPrice;publicstrin

33、gmyVendor,myID;.SerializablepublicclassChairpublicstringmyVendor,myID;l如果原对象增加了新字段,格式化器发现新字段后,会抛出异常(.NET2.0)。Serializablepublic class Chair public double myPrice; public string myVendor, myID; .Serializablepublic class Chair public string myVendor, myID; 可以为新字段附加可以为新字段附加OptionalField属属性。格式器会为新性。格式器会

34、为新字段指定一个默认字段指定一个默认值。值。Serializablepublic class Chair OptionalField public double myPrice; public string myVendor, myID; .l还可以利用逆串行化事件为新字段赋值。OnDeserializedvoidOnMyDeserialized(StreamingContextcontext)if(myVendor=“Lane”)finish=“OaK”;elsefinish=“Cherry”;反射反射l可以ILDasm反编译工具浏览一个dll和exe的构成这种机制叫做这种机制叫做反射(反射

35、(Reflection)应用程序或应用程序或dll类的属性类的属性类的方法类的方法应用程序信息应用程序信息用于在运行时通过编程方式获得类型信息用于在运行时通过编程方式获得类型信息反射反射现场演示现场演示l通过代码演示获取dll的版本号using System.Reflection;class Program static void Main(string args) string version = Assembly.LoadFile(D:MyNewsReader.exe) .GetName().Version.ToString(); Console.WriteLine(version); 引

36、入命名空间引入命名空间 反射反射什么是设计模式什么是设计模式l模式就是得到很好研究的范例走为上走为上 围魏救赵围魏救赵 声东击西声东击西 设计模式是软件开发过程中经验的积累设计模式是软件开发过程中经验的积累特定问题的经过实践检验的特定解决方法特定问题的经过实践检验的特定解决方法简单工厂模式简单工厂模式l简单工厂模式的原理父类产品父类产品 子类产品子类产品A 子类产品子类产品B 子类产品子类产品C 工厂工厂 客户客户 简单工厂模式简单工厂模式l工厂类:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的类实现。l抽象产品角色

37、:担任这个角色的类是由工厂方法模式所创建的对象的父类,或她们共同拥有的接口。一般由接口或抽象类实现。l具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例,由具体类实现。简单工厂模式优缺点简单工厂模式优缺点 l模式的核心是工厂类,这个类负责产品的创建,而客户端可以免去产品创建的责任,这实现了责任的分割。但由于工厂类集中了所有产品创建逻辑的,如果不能正常工作的话会对系统造成很大的影响。如果增加新产品必须修改工厂角色的源码。设计模式的意义设计模式的意义l提高软件的可复用性l灵活,适应软件设计的变化l面向对象在实际应用中集中体现简单工厂模式实例简单工厂模式实例父类产品父类产品 子类产品子类产

38、品A 子类产品子类产品C 工厂工厂 客户客户 public interface IApparel string ShowMe();public class SportShirt: IApparel public string ShowMe() return (“Sports Shirt”); public class DressShirt: IApparel public string ShowMe() return (“Dress Shirt”); public class ApparelFactory public IApparel CreateApparel (string apptyp

39、e) switch(apptype) case “DRESSSHIRT”: return new DressShirt(); case “SPORTSSHIRT”: return new SportsShirt(); return null; ApparelFactory=newApparelFactory();IApparelobj1=factory.CreateApparel(“DRESSSHIRT”);IApparelobj2=factory.CreateApparel(“SPORTSSHIRT”);stringshirtType=obj1.ShowMe();为什么需要抽象工厂设计模式为

40、什么需要抽象工厂设计模式父类产品父类产品子类产品子类产品A 子类产品子类产品B 子类产品子类产品C 工厂工厂客户客户:简单工厂设计模式原理结构:简单工厂设计模式原理结构 什么是抽象工厂设计模式什么是抽象工厂设计模式什么是抽象工厂设计模式什么是抽象工厂设计模式抽象工厂抽象工厂 实体工厂实体工厂2实体工厂实体工厂1抽象产品抽象产品A抽象产品抽象产品B实体产品实体产品B1实体产品实体产品B2实体产品实体产品A1实体产品实体产品A2客户客户 :抽象工厂设计模式原理结构:抽象工厂设计模式原理结构 什么是抽象工厂设计模式什么是抽象工厂设计模式l抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系

41、统的商业逻辑无关的。通常使用接口或抽象类实现。l具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体的类实现。l抽象产品角色:担任这个角色的类是抽象工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用接口或抽象类实现这一角色。l具体产品角色:抽象工厂模式所创建的任何产品对象都是某一具体产品类的实例。这是客户端最终需要的东西。通常使用具体类实现这个角色。什么是抽象工厂设计模式什么是抽象工厂设计模式1、提供一系列相互依赖对象的创建工作、提供一系列相互依赖对象的创建工作2、封装对象常规的创建

42、方法(、封装对象常规的创建方法(new)3、提供统一调用数据访问方法的方式、提供统一调用数据访问方法的方式4、避免调用数据访问方法和具体对象创建工作的紧耦合、避免调用数据访问方法和具体对象创建工作的紧耦合什么是抽象工厂设计模型什么是抽象工厂设计模型l提供一个创建一系列相关或相互依赖对象的接口,无需指定它们具体的类客户请求客户请求 抽象工厂抽象工厂抽象产品抽象产品如何用抽象工厂设计模式构建我们的数据访问层?如何用抽象工厂设计模式构建我们的数据访问层? 使用抽象工厂模式使用抽象工厂模式 l一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。l这个系统的产

43、品有多于一个的产品族,而系统只消费其中某一族的产品。l同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。l系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。如何使用抽象工厂设计模式如何使用抽象工厂设计模式1、用、用抽象工厂抽象工厂生产抽象产品生产抽象产品2、用、用实体工厂实体工厂生产生产实体产品实体产品3、用、用抽象产品抽象产品提供提供实体产品实体产品访问接口访问接口4、用、用实体产品实体产品实现自己的功能实现自己的功能:抽象工厂设计模式中各个象的主要功能、职责:抽象工厂设计模式中各个象的主要功能、职责应用示例应用示例礼服衬衫实体工厂礼服衬

44、衫实体工厂抽象产品抽象产品抽象工厂抽象工厂运动衫实体工厂运动衫实体工厂运动衫运动衫实实体产品体产品礼服衬衫实礼服衬衫实体产品体产品客户客户public abstract class AppFactory public abstract IApparel CreateApparel();public class DressShirtFactory : AppFactory public override IApparel CreateApparel() return new DressShirt(); public class SportShirtFactory : AppFactory public override IApparel CreateApparel() return new SportsShirt(); publicclassApparelCollectorpublicvoidCollectApparel(AppFactoryfactory)IApparelapparel=factory.CreateApparel();AppFactoryfactory=newDressShirtFactory();IApparelobj=newApparelCollector().CollectApparel(factory);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号