1.异常
2.常用的异常
2.1与参数有关的异常类:派生自SystemException,用于方法成员传递参数时发生异常
ArgumentException类:用于处理参数无效的异常。ArgumentNullException类:参数为空。
FormatException类:用于处理参数格式错误的异常。
2.2与数组有关的异常:继承自SystemException
IndexOutOfException类:用于处理下标超出了数组长度所引发的异常。
ArrayTypeMismatchException类:用于处理在数组中存储了数据类型不正确的元素所引发的异常。
2.3与IO有关的异常:继承自SystemException
IOException类:用于处理进行文件输入输出操作时所引发的异常。
2.4内存溢出有关的异常
OverFlowException类:用于处理程序逻辑错误造成的死循环异常。
2.5与算术有关的异常
ArithmeticException类:用于处理与算术有关的异常,比如0做除数。DivideByZeroException类。
2.6数据库操作异常类
DbException类:用于处理所有数据源操作异常类的基类。
SqlException类:用于处理针对sql数据源的异常,比如数据库链接错误。
3.异常处理
3.1“底层方法”将第一次捕获的异常传递给上级调用者进一步详细处理
1 public static int Update(string sql) 2 { 3 SqlConnection conn = new SqlConnection(connString); 4 SqlCommand cmd= new SqlCommand(sql,conn); 5 try 6 { 7 conn.Open(); 8 return cmd.ExecuteNonQuery(); 9 } 10 catch(Exception ex) 11 { 12 //此处可以添加日志 13 throw ex; 14 } 15 finally 16 { 17 conn.Close(); 18 } 19 } 20 21 try catch throw finally
3.2"中层调用者"可以使用多路捕获异常并封装详细异常信息
添加具体异常对象,通过判断错误号决定异常的类型。
1.多路捕获异常不是必须的,只有需要的时候才使用。
2.可以添加多个catch块。
3.一定要把Exception类放在最后。
ex.Number的使用,throw new Exception("********"+ex.Message);
throw ex;这种未经包装
throw new Exception("******"+ex.Message);这种稍微包装了一下
异常一般刚在业务逻辑里面,不需要放在界面里面,这样界面捕获后就直接显示。
4.系统功能较多并且业务复杂时,可以使用三层架构设计项目
表示UI:界面层
业务逻辑层BLL:将界面层或数据访问层的部分职责(逻辑代码)分离出来
数据访问层DAL:主要负责连接读写数据库
表示层UI、业务逻辑层BLL、数据访问层都需要访问实体层(Models)。
5.项目命名的一般规范
解决方案 项目名称+Pro
用户界面层 项目名称
业务逻辑层 项目名称+BLL 业务逻辑类:实体类名+Manager
数据访问层 项目名称+DAL 数据访问类:实体类名+Service
实体对象 一般和数据库实体相同
6.理解框架
作用:支撑、主导
7.典型两层架构设计原理
分表示层和数据访问层,表示层由前台开发人员夫负责,主要是和用户交互的界面;数据访问层由后台开发人员负责,主要完成数据库的操作。表示层和数据访问层由实体层连接,分层与实体类无必然联系,实体类只是数据传递的载体,什么时候都可以使用。
8.关于类库项目
类库项目专门提供软件的功能模块
类库项目最终生成的是一个dll文件
通过封装,类库项目能够很好的与外界协作,安全性高
9.两层架构项目之间的引用
数据访问层DAL需引用实体层Models,表示层From需引用数据访问层DAL和实体层Models。
10.实体对象的可序列化
10.1实体对象在程序中不断的被传递
表示层(UI)<——>实体对象Models<——>数据访问层DAL
10.2序列化与反序列
序列化:将对象状态转换为可保持或传输的格式的过程,在序列化过程中,对象的公有字段和私有字段以及类的名称(包括包含该类的程序集)都被转化为字节流,然后写入数据流。
反序列化:将流转化为对象,与序列化结合可轻松地存储和传输数据。
10.3对象序列化的意义
10.3.1将对的状态保持在存储媒体中,以便可以在以后重新创建精确的副本。
10.3.2将对象从一个应用程序域发送到另一个应用程序域,对象序列化以后保证数据传输的稳定和安全。
实体类Models的前面加 [Serializable]
11.接口
接口又叫接口类,接口也是类
使用关键字interface定义,接口类名称通常使用I开头
接口中的属性、方法等,只是做一个声明,没有任何实现
接口中的属性、方法等,默认都是public。
方法声明类似于抽象方法
11.1接口具有强制性,实现接口的类必须是西安接口的所有成员
11.2一个类既可以实现多个接口,也可以同时继承其他类
通常把父类写在接口的前面,继承了一个类,实现了一个接口
class Student:Person,IStudent,IComparable{...}
1 //定义接口 2 interface IMultiPrinter 3 { 4 void Print(string content); 5 void Copy(string content); 6 bool Fax(string content); 7 } 8 9 //类实现接口 10 class HPMultiPrinter:IMultiPrinter 11 { 12 public void Print(string content) 13 { 14 Console.WriteLine("惠普打印机正在打印..." + content); 15 } 16 17 public void Copy(string content) 18 { 19 Console.WriteLine("惠普打印机正在复印..." + content); 20 } 21 22 public bool Fax(string content) 23 { 24 Console.WriteLine("惠普打印机正在传真..." + content); 25 return true; 26 } 27 } 28 29 //调用接口 30 static void Main(string[] args) 31 { 32 //使用接口定义,类实现该对象 33 IMultiPrinter objPrinter = new HPMultiPrinter(); 34 objPrinter.Print("学生成绩表"); 35 objPrinter.Copy("学生信息表"); 36 objPrinter.Fax("老师信息表"); 37 Console.ReadKey(); 38 }
12.接口的实践
12.1提高团队成员并行开发项目的效率
接口使用者只关心接口的应用功能,不必关心接口的内部实现
接口实现者只关心如何实现接口的内部实现,不关系谁使用
12.2提高系统的可维护性
当用户的需求改变时,只需要修改接口的实现,系统即可更新
13.接口总结
接口的应用场合
如果某一个功能点需求变化较多,应使用接口保证系统的可扩展性
如果想实现团队成员的并行开发,可以使用接口来规范对象的使用
接口编写规范
接口成员只能是一个声明
实现接口的类必须全部实现接口中规定的属性、方法
特别说明
接口的使用不是必须的,要根据用户的需求来决定
14.继承多态
多态的应用大大提高了程序的可扩展性
继承多态实现的条件:1、父类中必须有抽象方法和虚方法
2、子类必须重写父类中的抽象方法或虚方法
3、子类对象必须转换成父类类型去使用
父类类型作为方法的参数类型,调用时实际传递的是子类的对象
15.接口多态
实现接口多态的条件:1、一个接口必须被两个或两个以上类实现
2、接口实现类必须转换成接口类型去使用
接口作为方法参数类型,调用时实际传递的是接口实现类的对象
接口多态在实践中应用最广泛
通俗来说,同样一个方法(方法声明的是接口类对象),因为传递的对象(传递的是接口的派生类)不一样,执行的过程和结果也不一样,这就是接口多态
1 //定义接口 2 interface IMultiPrinter 3 { 4 void Print(string content); 5 void Copy(string content); 6 bool Fax(string content); 7 } 8 9 //惠普类 10 class HPMultiPrinter : IMultiPrinter 11 { 12 public void Print(string content) 13 { 14 Console.WriteLine("惠普打印机正在打印..." + content); 15 } 16 17 public void Copy(string content) 18 { 19 Console.WriteLine("惠普打印机正在复印..." + content); 20 } 21 22 public bool Fax(string content) 23 { 24 Console.WriteLine("惠普打印机正在传真..." + content); 25 return true; 26 } 27 } 28 29 //佳能类 30 class JNMultiPrinter : IMultiPrinter 31 { 32 public void Print(string content) 33 { 34 Console.WriteLine("佳能打印机正在打印..." + content); 35 } 36 37 public void Copy(string content) 38 { 39 Console.WriteLine("佳能打印机正在复印..." + content); 40 } 41 42 public bool Fax(string content) 43 { 44 Console.WriteLine("佳能打印机正在传真..." + content); 45 return true; 46 } 47 } 48 49 //实现多态 50 class Program 51 { 52 static void Main(string[] args) 53 { 54 Print(new HPMultiPrinter()); 55 Print(new JNMultiPrinter()); 56 Console.ReadLine(); 57 } 58 59 static void Print(IMultiPrinter objPrinter) 60 { 61 objPrinter.Print("学生成绩表"); 62 objPrinter.Copy("学生信息表"); 63 objPrinter.Fax("老师信息表"); 64 } 65 }
16.接口与抽象类
抽象类 | 接口 | |
不同点 | 用abstract定义 | 用interface定义 |
只能继承一个类 | 可以实现多个接口 | |
非抽象派生类必须实现抽象方法 | 实现接口的类必须实现所有成员 | |
需要override实现抽象方法 | 直接实现 | |
相似点 | 都不能直接实例化 | |
都包含未实现的方法 | ||
子类或“接口实现类”必须实现未实现的方法 |
17.设计模式与简单工厂
简单工厂是设计模式中的一种。
什么是设计模式?设计模式是人们在开发中遇到的共性问题而提出的一个解决方案
程序开发中的设计模式只是一种参考,而不是一成不变的
简单工厂:典型应用是解决单一对象创建的扩展问题
抽象工厂:典型应用是解决多种类型数据库访问问题或不同业务逻辑
单例模式:典型应用是在开发中设计购物车的时候需使用
18.简单工厂
实现原理:工厂通过“选择”的方法来指定应该创建哪个“接口实现类的对象”
“工厂”其实就是一个对象创建的方法,让对象“延迟创建”
简单工厂创建步骤:
1、添加接口。
2、添加需要实现接口的类并实现接口。
3、添加工厂(建议使用静态类)。
<1>定义接口变量。
<2>读取配置文件。
<3>使用反射创建接口实现类的对象。
<4>返回接口变量(实际返回的是一个接口实现类的对象)
4、添加配置文件并配置相应的节点。
5、调用工厂方法并实现功能。
1 //接口 2 /// <summary> 3 /// 打印接口(产品原型) 4 /// </summary> 5 public interface IReport 6 { 7 void StartPrint(); 8 } 9 10 //实现接口的类1 11 public class ExcelReport:Factory.IReport 12 { 13 public void StartPrint() 14 { 15 System.Windows.Forms.MessageBox.Show("...正在调用Excel报表程序"); 16 } 17 } 18 19 //实现接口的类2 20 public class WordExport:Factory.IReport 21 { 22 public void StartPrint() 23 { 24 System.Windows.Forms.MessageBox.Show("...正在调用Word报表程序"); 25 } 26 } 27 28 //工厂类 29 public class Factory 30 { 31 //【1】定义接口变量 32 static IReport objReport = null; 33 //【2】读取配置文件 34 static string reportType = ConfigurationManager.AppSettings["ReportType"].ToString(); 35 //【3】根据配置文件初始化接口变量 36 public static IReport Choose() 37 { 38 switch (reportType) 39 { 40 case "ExcelReport": 41 objReport = new ExcelReport(); 42 break; 43 case "WordReport": 44 objReport = new WordExport(); 45 break; 46 default: 47 break; 48 } 49 return objReport; 50 } 51 } 52 53 //实现调用代码 54 private void btn_Print_Click(object sender, EventArgs e) 55 { 56 //IReport objReport = new ExcelReport();//new WordReport 57 //根据工厂提供的具体产品来使用 58 //这种设计方法,使得调用者和后台实现方法完全脱离,大大增加了系统的可扩展性 59 IReport objReport = Factory.Factory.Choose(); 60 objReport.StartPrint(); 61 }
19.反射 Reflection
反射的概念
反射是.NET中的一个重要技术。通过反射,可以在运行时获得某个类型的各种信息,包括方法、属性、事件、及构造函数等,还可以获得每个成员的名称等信息。
反射的特点
在程序运行时,动态创建对象、调用方法、设置属性和激励事件,而不是在编译的时候完成。
反射的应用
在VS中的智能提示、使用MSIL反汇编工具查看IL代码用的都是反射技术。
Java开发工具Eclipse中的插件使用,也是用反射技术。
开发中的应用
系统需要基于插件开发的时候,必须要用反射。
在简单工厂和抽象工厂设计模式中将使用反射技术。
使用反射一般都要配合接口使用。
反射技术是的系统性能一定程度降低,除非必要情况,反射不宜过多使用。
1 //1、创建接口类 2 namespace ICal 3 { 4 public interface ICalculator 5 { 6 int Add(int a, int b); 7 int Sub(int a, int b); 8 } 9 } 10 11 //2、创建计算器类实现接口 12 namespace CalDll 13 { 14 public class Calculator : ICal.ICalculator 15 { 16 public int Add(int a, int b) 17 { 18 return a + b; 19 } 20 21 public int Sub(int a, int b) 22 { 23 return a - b; 24 } 25 } 26 } 27 28 //3、使用反射技术应用接口 29 using System.Reflection;//【1】引入反射命名空间 30 using ICal;//【2】引入接口类库 31 32 private void btn_Cal_Click(object sender, EventArgs e) 33 { 34 //动态加载程序集并创建对象 35 ICalculator objCal = (ICalculator)Assembly.LoadFrom("CalDll.dll").CreateInstance("CalDll.Calculator"); 36 //通过接口完成运算 37 int result = objCal.Add(Convert.ToInt16(this.tb_Num1.Text.Trim()), Convert.ToInt16(this.tb_Num2.Text.Trim())); 38 this.lbl_Result.Text = result.ToString(); 39 }
20.基于接口设计三层架构
开发团队协作的保障——指定项目开发规范
项目命名、模块命名、类编写规范、注释要求...
数据库设计规范:表的命名、实体属性命名、约束...
项目开发中协作的形式:垂直分工、并行开发
垂直分工协作
任务分工:按功能模块
技术要求:要求开发人员必须熟悉项目各模块(DAL、BLL、UI)编写方法
应用场合:中小型项目,且开发团队力量较小
现实比较:类似于小企业的“作坊式”生产
人员特点:开发人员的工作贯穿整个项目
并行开发协作
任务分工:按层(BLL、DAL、UI)划分
技术要求:只要求开发人员熟悉项目其中一层(BLL、DAL、UI)的业务和编写方法
应用场合:大中型项目,且开发团队力量强
现实比较:类似于大企业的“专业化、流水线”生产
人员特点:熟悉系统业务的开发人员设计BLL业务层
熟悉数据库开发的人员设计DAL数据层
善于设计用户界面的开发人员设计UI