压缩黑马九期dotnet基础加强v1_第1页
压缩黑马九期dotnet基础加强v1_第2页
压缩黑马九期dotnet基础加强v1_第3页
压缩黑马九期dotnet基础加强v1_第4页
压缩黑马九期dotnet基础加强v1_第5页
已阅读5页,还剩168页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、北京传智播客教育 .Net基础加强讲师:赵晓虎 课前准备给大家一个建议:有问题多问,同样的时间,问的多就学的多。本课程目的:让大家都具有最基本的编程水平,保证能正常进行后续的课程。基础不好的同学抓紧复习(一次很好的机会)基础好的同学(复习,看参考书籍,继续提升,有问题可以问)C#图解教程、C# via CLRCSharp Language Specification.doc【C:Program FilesMicrosoft Visual Studio 10.0VC#Specifications2052CSharp Language Specification.doc】在vs的安装目录下。可以一

2、章一章的看,也可以讲到哪里看到哪里。编程到底怎么学?那么多语言该学哪门?老杨的一个经典比喻:选择一种语言泡妞。多做练习,就像游泳。反复练习,就像打铁。反复捶打,去除杂质 ,保留精华。书要越看越薄。温故而知新。做课堂笔记(听课优先,然后做笔记)课前说明课程内容中大部分是所有同学都需要掌握的,但是对于部分技术水平比较好的同学为了让其就业会有更高的薪资,所以课程中有一部分内容是相对比较难的,对于这部分内容ppt上会加*,加*的内容不要求所有同学都掌握。为了保证毕业后都能找到一份工作,所以建议大家应该把必须掌握的知识都掌握了以后再考虑加*的内容。复习(参考:基础知识复习.doc)交换两个变量的值。(如

3、果会使用ref,则用方法做,传递2个int参数。) int num1 = 5;int num2=6;通过程序交换让num1 = 6,num2=5;用方法实现(注:考虑方法的参数、返回值是什么?):求两个数的最大值(传递两个int类型参数) 。扩展:(求三个数最大值,params)求1-100之间所有奇数的和。找胖子,200,120,90,180,110,找最胖的人.(求最大值,参数是int类型数组。)不能调用数组的Max()方法。c#时间格式转换汉字大写 比如: “2011年6月4日” 转换成 “二零一一年六月四日”。(参考提示:把字符串作为char数组来用,判断如果是2二,0零,1一)。暂时

4、不考虑10日、13日、23日等问题。创建一个Person类,属性:姓名、性别、年龄;方法:SayHi() 。再创建一个Employee类继承Person类,扩展属性Salary,重写SayHi方法。新建控制台应用程序来完成以上问题。再次强调代码规范规则(法律,必须遵守否则报错)语法规范(道德,大家都喜欢有道德的人。)注释骆驼命名 :第一个单词首字母小写,之后的单词首字母大写 userName、userPassword、realName(普通变量(局部变量)、字段)帕斯卡命名:第一个单词首字母大写,之后的单词首字母大写 GetMax()、ChangeName()(方法名、类名、属性名)定义的变量

5、或者方法 名字要有意义。方法名:动词。Write()、Open()、Close()、Dispose()、GetUserId()、(方法都是要做一件事情)变量名:按功能命名、按方法的返回值内容命名(userName=GetUserName();)上课记笔记!复习WinForm桌面程序,桌面应用程序是相对于Web应用程序而言的。 桌面应用程序:QQ、迅雷、OfficeWeb应用程序:网上银行系统、163邮箱系统、电子商务网站、网上预约挂号平台WinForm的控件TextBox、Timer、CheckBox、TreeView、GroupBox、Label、Button、RadioButton、Che

6、ckBoxList、RadioButtonList、Form、PictureBox、ComboBox、Panel、。WinForm程序是事件驱动的。案例:制作一个简易计算器,默认为“请选择”.net程序基本编写、执行流程(c#)1编写c#代码,保存为.cs文件。2通过csc.exe程序来将.cs文件编译为.net程序集(.exe或.dll)。此时的exe或dll并不是机器码(cpu不可理解)。【csc /out:c:a.exe c:program.cs】C:Windows Frameworkv4.0.30319csc.exe3程序运行时通过JIT编译(Just In Time)即时编译,将程序

7、集编译为cpu能理解的机器码,这时cpu才能执行。(这个编译过程会与当前机器有关(根据当前机器的内存、cpu等)。NGen.exe面向对象(OO)什么是面向对象?一种分析问题的方式(增强了程序的可扩展性)。面向对象三大特性:封装、继承、多态。什么是类?什么是对象?类和对象的区别?如何写一个汽车类?类是模具,创建对象的模具,抽象的。类是一种数据类型,用户自定义的数据类型类组成:字段、属性、方法、构造函数等对象是具体的,是类的具体实例。对象具有属性(特征)和方法(行为)类中包含了数据(用字段表示)与行为(用方法(函数、功能)表示,方法为一块具有名称的代码)案例:创建学生类,老师类,通过构造函数初始

8、化类内部字段this ,当前对象案例:使用面向对象方式重做计算器v2.0。(写一个Calculator类,里面有几个计算方法。)实现WinForm版本与控制台版本。练习:猜拳游戏。先分析类和对象。实现WinForm版本与控制台版本。添加引用与导入命名空间的区别添加引用(前提)添加程序集导入命名空间namespace (ctrl+ . 或shift + alt + F10)为什么在另一个项目中建的类,添加引用后还是不能使用?(类的访问修饰符默认:internal,改成public)“参数”与“返回值”参数的个数、类型与返回值没有任何半毛钱关系。控制台应用程序中不要新建Form再次说明this的使

9、用,通过this访问类的属性。this.Fist变量作用域变量作用域:离声明该变量最近的那对包含声明语句的大括号内部。成员变量直接属于某个类,作用域在该类内部。成员变量使用前如果不赋值,默认会有一个初始值。stringnull;int0;boolfalse局部变量声明该变量的块语句或方法结束的封闭括号之前的作用域内(使用之前必须得赋值。)思考:public void M1()int n=10;if(n5)int n=100;/对吗?封装提问:大家觉得什么是封装?遥控器刚出来时候很神奇,点个按钮就能换电视台、切音量、关电视。而我们使用遥控器的人不需要知道他是怎么实现的(你只需要知道每个按钮的功能

10、即可)和遥控器类似,面向对象的封装就是把事物的状态和行为封装在类中,使用类的人不需要知道类内部是怎么实现的,只要调用其中的属性和方法实现功能就行。就像你使用遥控,不需要知道他是怎么控制电视的,只要知道按钮能换台就行类和对象本身就是封装的体现。1.属性封装了字段、2.方法的多个参数封装成了一个对象、3.将一堆代码封装到了一个方法中、4.将一些功能封装到了几个类中、5.将一些具有相同功能的代码封装到了一个程序集中(dll、exe),并且对外提供统一的访问接口。(属性名、方法名等。)继承(是指类与类之间的关系。)车 (Vehicle) 卡车(Truck)轻型卡车重型卡车 轿车 (Car)-小轿车面包

11、车如何判断一个继承关系是否合理?子类 is a 父类。卡车和轿车都是车,都有轮子、发动机。但是卡车又能拉货,轿车能拉人Base Class基类、Parent Class父类Derived Class派生类、Child Class子类为什么要继承?继承带给我们的好处?代码重用LSP(Liskov)里氏替换原则(通过代码说明一下,声明父类类型变量,指向子类类型对象,以及调用方法时的一些问题)、多态。(程序的可扩展性、灵活性)方法重写override。虚方法的原理:虚方法表。子类继承父类的属性和方法,使创建子类变得很简单,实现了代码重用、以及多态。类的单根继承性、传递性、继承时构造函数的问题。构造函

12、数不能被继承。所有的类都直接或间接的继承自object。查看IL代码。关于继承的那些事儿案例:定义学生类(姓名、性别、年龄、成绩,Hello方法)、老师类(姓名、性别、年龄、工资、Hello方法)从中抽象出一个父类,通过构造函数给子类字段赋值protected 只能在子类内部和当前类内部中使用可以在类内部以及所有子类中(内部)访问。this:1.作为当前类的对象,可以调用类中的成员。this.成员(调用成员,自己)2.调用本类的其他构造函数。:this()(调用构造函数,自己)reflector查看base:1.调用父类中的成员(在子类重写父类成员或者子类使用new关键字隐藏了父类成员时,调用

13、父类成员)base点不出子类独有成员。2.调用父类中的构造函数(调用构造函数,父类)当调用从父类中继承过来的成员的时候,如果子类没有重写则this.成员;与base.成员;没有区别。如果子类重写了父类成员,则this.成员;调用的是子类重写以后的。base.成员;调用的依然是父类的成员。子类构造函数必须指明调用父类哪个构造函数练习练习:定义父亲类Father(姓lastName,财产property,血型bloodType),儿子Son类(玩游戏PlayGame方法),女儿Daughter类(跳舞Dance方法),调用父类构造函数(:base()给子类字段赋值练习:定义汽车类Vehicle属性

14、(brand(品牌),color(颜色)方法run,子类卡车(Truck) 属性weight载重 方法拉货,轿车 (Car) 属性passenger载客数量 方法载客练习:升级猜拳游戏(加入父类【继承】)注意:当this与base作为调用构造函数的语法的时候,参数的传递可能会有的疑惑。:base(参数,参数)类中的成员如果不写访问修饰符默认是private.访问修饰符作用:指明程序的其他部分如何访问该成员。共5种:private 当前类中可以访问,类中成员的默认访问修饰符。protected 当前类及子类中可以访问(在继承中用。)internal 当前程序集内部可以访问protected in

15、ternal当前程序集或子类中(不同程序集也可以访问)。public 任何地方访问级别约束访问级别约束子类的访问级别不能比父类的高。(会暴露父类的成员)类中属性或字段的访问级别不能比所对应的类型访问级别高。方法的访问级别不能比方法的参数和返回值的访问级别高。用于解决“可访问性不一致”的错误。实现多态的手段1-虚方法virtual PersonChineseAmericanKorean,每个国家的人都有一个说出自己国籍的方法。当有一个Person的时候,循环现实每个国家的人。虚方法可以给父类中的方法一个实现,比如ToString()方法虚方法必须有实现部分,哪怕是空实现。案例:员工类、部门经理类

16、(员工有上班打卡的方法。用类来模拟。练习:把Person类中的SayHello改为虚方法让其默认为学生的,增加老师、司机类。虚方法和抽象方法的区别。 见备注方法重写注意事项子类重写父类方法时,必须与父类保持一致的方法签名与返回值类型。即:方法名、返回值类型、参数列表都必须保持一致。 访问修饰符也得一致“方法签名”:一般是指方法的【名称】+方法的【参数列表】,不包含方法返回值类型静态成员-通过类名访问、实例成员-通过对象访问先通过窗体之间共享值,以及工具类,说明为什么要用static。C#中声明的所有的变量都需要在类型中,不能在类型以外直接声明全局变量,与c或c+不同。没有全局变量的概念。静态成

17、员是与“类”相关,而非与“实例”相关。普通类中的静态成员static只能通过类名访问静态方法中只能访问静态成员,或通过对象访问实例成员。多个对象共享同一个静态成员。静态类(一般都用作工具类,里面都是一些工具函数)Math、Console、Convert 等都是静态类。静态类中只能包括静态成员静态构造函数不能有参数、不能有访问修饰符(默认为private)。静态构造函数在第一次使用该静态类的时候只执行一次。静态成员属于类所有,非静态成员属于类的实例所有C#静态方法属于类所有,类实例化前即可使用在实例方法中可以直接调用静态方法,在静态方法中不可以直接调用实例方法静态方法和静态变量创建后始终使用同一

18、块内存(静态存储区),而使用实例的方式会创建多个内存少使用静态类,静态类、静态成员所分配的内存在程序退出时才会释放。什么时候使用静态成员、静态类1.在实例类中使用静态成员。账户类:(实例类)class AccountUserName /用户名Address /地址Total /存款额static Rate /利率,由于该银行采用浮动利率,每天的利率根据当天的挂牌利率(基准利率)来计算,所以“利率”不适合作为每个对象单独的一个数据。/当多个对象共享同一个数据的时候就可以在实例类中加入静态成员。2.使用静态类在项目中需要频繁用到的一些工具类,例如:Math、Console、Convert 等。或者

19、模拟“全局变量”的时候。多态:为了程序的可扩展性。开放封闭原则(对修改封闭,对扩展开放。)先看看ToString()方法。普通类的ToString()、Int32多态就是指不同对象收到相同消息时,会产生不同行为,同一个类在不同的场合下表现出不同的行为特征多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。里氏替换原则父类引用指向子类对象Person p=new Chinese();(隐式类型转换)父类对象不能够替换子类Chinese c=(Chinese)new Person();()is-a:可以用来验证继承关系中

20、是否合理。(can do,验证实现接口是否合理*)if(obj is 类型A)/obj是父类类型对象,”类型A”是子类类型。关键字as (类型转换)、 is(通常类型转换前需要通过is来判断一下类型。)实现多态的方式virtual,子类重写父类中的方法。abstract,子类重写父类中的方法。接口,实现接口的类,将接口中的方法实现。怎么实现多态1-抽象类abstract抽象类不能被实例化。抽象类中可以有普通成员。抽象类存在的意义:1.抽象类不能被实例化,只能被其他类继承2.继承抽象类的子类必须把抽象类中的所有抽象成员都重写(实现)(除非子类也是抽象类。)3.抽象类就是为了重写多态(代码重用)。

21、4.抽象类中可以有实例成员也可以有抽象成员。什么是抽象类(光说不做)不能被实例化的类(不能new)抽象类的特点见备注案例:学生类和老师类中抽象出父类(Person),并让学生和老师都要具有SayHello和起立Standup两个方法练习1:动物Animal 都有吃Eat和叫Bark的方法,狗Dog和猫Cat叫的方法不一样.父类中没有默认的实现所哟考虑用抽象方法。练习2:计算形状Shape(圆Circle,矩形Square,正方形Rectangle)的面积、周长抽象类练习要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的移动存储

22、设备,所以计算机必须有扩展性,能与目前未知而以后可能会出现的存储设备进行数据交换。各个存储设备间读、写的实现方法不同,U盘和移动硬盘只有这两个方法,MP3Player还有一个PlayMusic方法橡皮鸭子(RubberDuck)、真实的鸭子(RealDuck)。两个鸭子都会游泳,而橡皮鸭子和真实的鸭子都会叫,只是叫声不一样,橡皮鸭子“唧唧”叫,真实地鸭子“嘎嘎”叫new(*) 隐藏、截断(用的不多,了解)方法的隐藏Swim方法是子类特有 class RubberDuck:Duck /方法的隐藏 /子类特有的方法,只不过方法名和父类重名了 public new void Swim() Conso

23、le.WriteLine(swim 被改变了); 如果一个方法在子类中被重写 Duck duck = new RubberDuck() ; duck.Bark() 调用子类的方法,因为被重写。了抽象方法子类必须重写所以不能用new.使用第三方dll的时候,原来没有SayHi方法,自己继承后加了个SayHi(),后来第三方dll更新,也加了个SayHi(),继承后的类中现在就得用new了。面向对象计算器使用面向对象的方式实现+、-、* 、/的计算器1、找对象2、抽象出父类,让子类都有计算能力3、实现子类4、产生子类对象的工厂5、调用哪部分是可能扩展的就尝试将该部分抽象(封装变化,将变化的地方抽象

24、出来),以便多态。设计模式(GOF23种设计模式)世上本没路,走的人多了也就成了路设计本没模式,程序写多了也就有了模式总结前人的思想,总结出的解决某一类问题的通用方法刚才的计算器就是设计模式中简单工厂设计模式 各种设计模式的本质都是:多态。充分理解了多态,再看设计模式就会觉得轻松很多。值类型 引用类型值类型均隐式派生自System.ValueType数值类型、bool、结构、枚举查看IL,隐式继承自ValueType引用类型派生自System.Object字符串、数组、类、接口等查看IL隐式继承自Object引用类型变量的赋值只复制对对象的引用。值类型变量赋值会拷贝一个副本。值类型、引用类型作

25、为参数传递值传递,刚才讨论的参数传递方式都是值传递。引用传递,ref,传递的是变量的地址。值传递(普通的参数传递)引用传递(ref)(*)值类型、引用类型值传递、引用传递值传递:引用类型、值类型引用传递(ref):引用类型、值类型。怎么实现多态2-接口什么是接口?接口就是一种规范,协议(*),约定好遵守某种规范就可以写通用的代码。定义了一组具有各种功能的方法。(只是一种能力,没有具体实现,像抽象方法一样,“光说不做”)接口存在的意义:多态。多态的意义:程序可扩展性。最终节省成本,提高效率。接口解决了类的多继承的问题接口解决了类继承以后体积庞大的问题。接口之间可以实现多继承先从语法角度看一下接口

26、,与抽象类类似。案例(继承了一个类,同时实现了其他接口)鸟-麻雀sparrowspru ,鸵鸟ostrichstrit ,企鹅penguinpengwin ,鹦鹉parrotprt 鸟能飞,鸵鸟,企鹅不能。你怎么办子类继承抽象类,实现接口接口中的成员必须不能有实现,接口不能实例化。接口中的成员不能有访问修饰符,隐式公开public接口中可以有属性、方法、索引器等(其实都是方法),但不能有字段接口中的所有成员必须被子类中全部实现,除非子类是抽象类,把接口中的成员标记为抽象的。练习:从学生,老师,校长类中抽象出人的类,学生和老师都有收作业的方法,但是校长不会收作业再看一个接口案例回顾:接口是一种规

27、范。什么是规范?理解规范的意义。规范,就是告诉我们要做什么,具有什么能力。在程序中为什么需要规范?(多态,可以让我们编写通用的代码,提高程序的可扩展性)接口就像“法律”。登记方法(接口作为参数,实现多态)DengJi(Person person) /人口登记,Person是抽象类DengJi(Car car) /汽车也要登记DengJi(House house) /房子也要登记。 IJiKouDengJi(IJieKou jk);练习橡皮rubber鸭子、木wood鸭子、真实的鸭子realduck。三个鸭子都会游泳,而橡皮鸭子和真实的鸭子都会叫,只是叫声不一样,橡皮鸭子“唧唧”叫,真实地鸭子“

28、嘎嘎”叫,木鸭子不会叫.把抽象类变成接口。显示实现接口(*)为什么要显示实现接口?方法重名后的解决办法。显示实现接口后,只能通过接口来调用。不能通过类对象本身来调用(显示实现的接口,查看IL是private的,防止通过类来调用)为什么要有“显示实现接口”?可以解决重名方法的问题。什么是“显示实现接口”?实现接口中的方法时用:接口名.方法名(),并且没有访问修饰符,private“显示实现接口”后怎么调用?只能通过接口变量来调用,因为显示实现接口默认为private。接口的特点总结接口是一种规范。为了多态。接口不能被实例化。接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,

29、不能修改。(默认为public)接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。接口中只能有方法、属性、索引器、事件,不能有“字段”。接口与接口之间可以继承,并且可以多继承。实现接口的子类必须实现该接口的全部成员。一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么语法上A必须写在IA的前面。class MyClass:A,IA,因为类是单继承的。当一个抽象类实现接口的时候,如果不想把接口中的成员实现,可以把该成员实现为abstract。(抽象类也能实现接口,用abstrac标记)“显示实现接口”,只能通过接口变量来调用(因为显示

30、实现接口后成员为private)。使用接口的建议面向抽象编程,使用抽象(父类、抽象类、接口)不使用具体。“向上转型”在编程时:接口抽象类父类具体类(在定义方法参数、返回值、声明变量的时候能用抽象就不要用具体。)能使用接口就不用抽象类,能使用抽象类就不用类,能用父类就不用子类。避免定义“体积庞大的接口”、“多功能接口”,会造成“接口污染”。只把相关联的一组成员定义到一个接口中(尽量在接口中少定义成员)。单一职责原则应用在了接口上“接口隔离原则”。定义多个职责单一的接口(小接口)(组合使用)。(印刷术与活字印刷术)随着学习的深入再继续体会接口的作用。抽象类复习、简单工厂设计模式复习(*)抽象类:不

31、能被实例化,需要被继承。多态。子类必须重写父类中的所有的抽象成员,除非:子类也是一个抽象类。抽象成员在父类中不能有任何实现。抽象类中可以有实例成员。抽象成员的访问修饰符不能是private抽象成员只能写在抽象类中。abstract作业:通过案例笔记本电脑的选择。笔记本电脑父类NoteBook、不同品牌的笔记本产品。(继承+简单工厂)接口复习(*)定义接口的语法(interface)接口中只能包含方法、属性、索引器、事件。不能包含字段。见备注1(貌似事件像一个字段?其实是两个方法。reflector查看源码)。接口中的成员不能有任何的实现(真正的“光说不做”。思考这样做的意义。联想抽象类中的抽象

32、方法。)接口中的成员不能写访问修饰符。使用接口的语法一个类可以实现多个接口。实现接口的类,必须把接口中的所有成员都实现。子类实现接口中的成员时,不能修改成员的访问修饰符、参数列表、方法名等。(与方法重写一样)面试题1. 如何使用virtual和override?Person per = new Student();per.SayHI()调用的子类重写的SayHi方法(语法、应用(多态))2. 如何使用abstract和override?3. “方法重载overload” 、 “方法重写override、 隐藏new是同一个概念吗?4.抽象类和接口的区别?见备注1.抽象类适用于同一系列,并且有需

33、要继承的成员。接口适用于不同系列的类具有相同的动作(行为、动作、方法)。对于不是相同的系列,但具有相同的行为,这个就考虑使用接口。接口解决了类不能多继承问题。类型转换CAST隐式类型转换double num=10;/sizeof(double)/sizeof(int)显示类型转换int n=(int)num;把学生转换为人是隐式转换,把人转换为学生则是显式转换(强制转换)Student s = new Student(); Person p =s;/隐式类型转换Student stu = (Student)p;/显示类型转换 、obj as 类型。只有在内存存储上存在交集的类型之间才能进行隐式

34、转换。不能用Cast转换string/int,只能用Convert。Convert.ToInt32/Convert.ToString补充:Convert将任意类型转换成字符串:ToString()将字符串转换成“数值类型”(int、float、double):int.Parse(string str); 、int.TryParse(string str,out int n);/很常用,推荐。double.Parse(string str);、double.TryParse(string str,out double d);Parse()转换失败报异常,TryParse()转换失败不报异常。再说

35、as与直接类型转换:(*)if(p is Student) Student stu=(Student)p; CLR会进行两次类型检查if(检查一次) /再检查一次 通过GetType(),GetType()不允许重写。Student stu=p as Student; /推荐,效率高于第一种,如果转换失败返回null,而不会报异常。类型转换ConvertConvert考虑数据意义的转换。 Convert是一个加工、改造的过程。若要进行其它类型的转换可以使用Convert.ToInt32、Convert.ToString等。Convert可以把object类型转换为其它类型string str=

36、 null;int num= 0; num = Convert.ToInt32(str);Console.Write(num +“rn”);num= Int32.Parse(str);Console.Write(num +“rn”);Int32.TryParse(str, out num);Console.Write(num +rn);当遇到类型转换的时候不知道该怎么转,可以去Convert中找找。异常处理1什么是异常?程序运行时发生的错误。(错误的出现并不总是程序员人的原因,有时应用程序会因为最终用户或运行代码的环境改变而发生错误。比如:1.连接数据库时数据库服务器停电了;2.操作文件时文件

37、没了、权限不足等;3.计算器用户输入的被除数是0;4.使用对象时对象为null;等等。).net为我们把“发现错误(try)”的代码与“处理错误(catch)”的代码分离开来。异常处理的一般代码模式:try 可能发生异常的代码 catch 对异常的处理 finally 无论是否发生异常、是否捕获异常都会执行的代码 try块:可能出问题的代码。当遇到异常时,后续代码不执行。catch块:对异常的处理。记录日志(log4net),继续向上抛出等操作。(只有发生了异常,才会执行。)finally块:代码清理、资源释放等。无论是否发生异常都会执行。案例:int x = 5;int y = 0;int

38、z = x / y;程序运行运行时出错,后续的内容无法运行程序一旦有一个功能发生异常,整个程序崩溃其它功能也无法正常运行异常处理2异常处理代码的其他几种形式:try 多个catch 一个finallytry(1个或多个catch),多个catch的顺序问题。可以没有finally。tryfinally(只能有一个),没有catch也可以。注意点:发生异常后,try块中,异常代码后的代码不会执行。finally块中的代码,无论是否发生异常都会执行。finally中不能写return语句。try中有return语句,finally也会执行即便没有catch(或者没有找到合适的catch块),fin

39、ally中的代码也会执行,但finally之后的代码则不会。(见备注1.)Exception ex 异常也是对象,封装了异常发生时的一些信息。Exception 类主要属性:Message、StackTrace、InnerException(*)扔出自己的异常,扔:throw,抓住:catch建议:通过逻辑判断(if-else)减少异常发生的可能性!尽量避免使用“异常处理”。在多级方法嵌套调用的时候,如果发生了异常,则会终止所有相关方法的调用,并且释放相关的资源。 代码观察观察1:见备注1。问题:try块中发生异常与不发生异常时的输出结果分别是什么?观察2:见备注2。问题:try块中发生异常与

40、不发生异常时的输出结果以及方法的返回值是什么?观察3:见备注3。问题:try块中发生异常与不发生异常时finally块中的代码是否被执行了?该方法的返回值又分别是多少?观察4:见备注4。问题:当调用该方法时,返回的Person对象的Age属性在try块中发生异常与不发生异常时输出结果分别是多少?函数返回值(函数参数前的修饰符)params 可变参数 无论有几个参数,必须出现在参数列表的最后。可以为可变参数直接传递一个对应类型的数组。ref 仅仅是一个地址,引用传递,可以把值传递强制改为引用传递out 让函数可以输出多个值1.在方法中必须为out参数赋值2.out参数的变量在传递之前不需要赋值,

41、即使赋值了也不能在方法中使用。(赋值没意义)ref参数在传递之前必须赋值在方法中可以不为ref参数赋值,可以直接使用。ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。ref与out案例案例1:两个int变量的交换,用方法做。ref ? out案例2:模拟登陆,返回登陆是否成功(bool),如果登陆失败,提示用户是用户名错误还是密码错误”admin”,“888888”【两个返回值,一个bool,一个string】 ref ? outswap(int n,int m)/交换两个变量cw(n,m)bool login(string uid,s

42、tring pwd)方法重载1.方法名称相同2.方法签名不同方法名参数类型、个数、(顺序)参数的修饰符(ref、out、params)不包含方法返回值。Equals、=、ReferenceEquals方法比较两个对象是否为同一个对象?什么是同一个对象?为什么字符串的Equals和别的不一样? /string的Equals方法判断的是字符串的内容是否相同(重写了Object中的Equals方法。) /而object中的Equals方法是判断对象的地址是否相同查看String类的=运算符,内部调用的也是Equalsobject.Equals();/用这个来比较两个对象。/补充一个:如何判断str1

43、与str2是否为同一个对象?Equals已经不可靠了。=也不靠谱了。(=运算符重载后也是调用的 EqualsHelper()来判断的,与Equals(string)方法一样。)判断两个对象是否相同要用:object. object.ReferenceEquals();常用类库String学习.net就是学习它的无数个类库怎么用,先看两个简单的字符串的一些特性:不可变性(ToUpper演示)字符串暂存池(拘留池)(针对字符串常量)内部维护一个哈希表key为字符串,value是地址。每次为一个新变量赋值都会找key中是否有,如果有则直接把value中的地址赋值给新变量演示abc与控制台输入的abc

44、与a+b+c与三个变量abc相加是否为同一个对象,以此说明只针对常量。(*)(暂存、拘留、驻留)字符串留用(Intern,针对变量常量,见备注1)。对于动态字符串本身在哈希表中没有,通过这种Intern可以添加到该哈希表中,目的为了提高性能。String.Intern(xx), Intern 方法使用暂存池来搜索与 str 值相等的字符串。如果存在这样的字符串,则返回暂存池中它的引用。如果不存在,则向暂存池添加对 str 的引用,然后返回该引用。 String.IsInterned(xx),此方法在暂存池中查找 str。如果已经将 str 放入暂存池中,则返回对此实例的引用;否则返回 null

45、Nothingnullptrnull 引用String 字符串,字符串可以看成字符数组,不可变特性(通过for循环,修改string中的元素,失败!)。属性Length /获得字符串中字符的个数。”aA我你他”5方法IsNullOrEmpty()静态方法,判断为null或者为” (静态方法)ToCharArray() 将string转换为charToLower()小写,必须接收返回值。(因为:字符串的不可变);ToUpper() 大写。Equals() 比较两个字符串是否相同。 忽略大小写的比较, paration.IndexOf() 如果没有找到对应的数据,返回-1./面试题:统计一个字符串

46、中,”天安门”出现的次数。LastIndexOf()如果没有找到对应的数据,返回-1Substring()/2个重载,截取字符串。Split() /分割字符串。Join()静态方法Format()静态方法Replace()字符串的处理练习1课上练习1:接收用户输入的字符串,将其中的字符以与输入相反的顺序输出。abccba“.课上练习2:接收用户输入的一句英文,将其中的单词以反序输出。 “I love you“I evol uoy课上练习3:”2012年12月21日”从日期字符串中把年月日分别取出来,打印到控制台课上练习4:把csv文件中的联系人姓名和电话显示出来。简单模拟csv文件,csv文件

47、就是使用,分割数据的文本,输出: 姓名:张三 电话: string lines = File.ReadAllLines(“1.csv”,Encoding.Default);/读取文件中的所有行,到数组中。字符串的处理练习2练习5:123-456-7-89-123-2把类似的字符串中重复符号”-”去掉,既得到123-456-7-89-123-2. split()、StringSplitOptions.RemoveEmptyEntries Join()练习6:从文件路径中提取出文件名(包含后缀) 。比如从c:ab.txt中提取出b.txt这个文件名出来。以后还会学更简单的方式:“正则表达式”,项目

48、中我们用微软提供的:Path.GetFileName();(更简单。)练习7:“port=21,type=ftp”,这个字符串表示IP地址为的服务器的21端口提供的是ftp服务,其中如果“,type=ftp”部分被省略,则默认为http服务。请用程序解析此字符串,然后打印出“IP地址为*的服务器的*端口提供的服务为*” line.Contains(“type=”)。port=21练习8:求员工工资文件中,员工的最高工资、最低工资、平均工资作业:“北京传智播客软件培训,传智播客.net培训,传智播客Java培训。传智播客官网: 。北京传智播客欢迎您。”。在以上字符串中请统计出”传智播客”出现的次

49、数。找IndexOf()的重载。常用类库StringBuilderStringBuilder高效的字符串操作当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作。String 对象是不可变的。 每次使用 System. String 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。 在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常大。 如果要修改字符串而不创建新的对象,则可以使用 System.Text. StringBuilder 类。 例如,当在一个循环中将许多字符串连接在一起时,使用 StringBui

50、lder 类可以提升性能。 StringBuilder != String/将StringBuilder转换为String.用ToString();StringBuilder仅仅是拼接字符串的工具,大多数情况下还需要把StringBuilder转换为String.StringBuilder sb = new StringBuilder();sb.Append();/追加字符串sb.ToString();/把StringBuilder转换为字符串。sb.Insert();sb.Replace();案例:使用程序拼html中的tableString大量拼接演示。垃圾回收(*)CLR的一个核心功能垃

51、圾回收。垃圾回收的目的:提高内存利用率。垃圾回收器,只回收托管堆中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等)。什么样的对象才会被回收?没有变量引用的对象。没有变量引用的对象,表示可以被回收了(null),断了线的风筝,再也回不来了。大学食堂(自己收盘子)、大排档(不需要程序员自己收盘子)什么时间回收?不确定,当程序需要新内存的时候开始执行回收。GC.Collect();/手动调用垃圾回收器。不建议使用,垃圾回收时会暂停一下(非常短暂)让程序自动去GC。垃圾回收器中“代”的概念:共3代:第0代、第1代、第2代。各代的回收频率:第0代最高,其次第1代,再次第2代。也就是说越老的

52、对象生存几率越大。.net中垃圾回收机制: pact(标记和压缩),一开始假设所有对象都是垃圾。除了内存资源外的其他资源怎么办?或者Dispose().net中的集合集合命名空间:using System.Collections;(非泛型集合)using System.Collections.Generic;(泛型集合)常用集合“类似数组”集合:ArrayList、List“键值对”集合(“哈希表”集合):Hashtable、Dictionary“堆栈”集合:Stack、Stack(LIFO)“队列”集合:Queue、Queue(FIFO)“可排序键值对”集合:(插入、检索没有“哈希表”集合高

53、效)SortedList、SortedList (占用内存更少,可以通过索引访问)SortedDictionary (占用内存更多,没有索引,但插入、删除元素的速度比SortedList快)Set 集合:无序、不重复。HashSet,可以将 HashSet类视为不包含值的 Dictionary集合。与List类似。SortedSet(.net4.0支持,有序无重复集合)“双向链表”集合:LinkedList,增删速度快。集合类(增、删、查、改、遍历)ArrayList、Hashtable、List、Dictionary数组特点:类型统一、长度固定。集合常用操作 添加、遍历、移除命名空间Syst

54、em.Collections ArrayList 可变长度数组,使用类似于数组属性 Capacity(集合中可以容纳元素的个数,翻倍增长); Count(集合中实际存放的元素的个数。)方法 Add(10) AddRange(ICollection c) Remove() RemoveAt() Clear() Contains() ToArray() Sort() 排序Reverse();/反转Hashtable 键值对的集合,类似于字典,Hashtable在查找元素的时候,速度很快。 Add(object key,object value);hash“key”hash“key”=“修改”;.C

55、ontainsKey(“key”);Remove(“key”);遍历:hash.Keyshash.Values/DictionaryEntry键值对集合中的“键”,绝对不能重复。键值对集合原理示意图案例:两个(ArrayList)集合 “a”,“b”,“c”,“d”,“e”和 “d”, “e”, “f”, “g”, “h” ,把这两个集合去除重复项合并成一个。案例:随机生成10个1-100之间的数放到ArrayList中,要求这10个数不能重复,并且都是偶数(添加10次,可能循环很多次。)Random random=new Random();random.next(1,101);/随即生成1-

56、100之间的数。练习:有一个字符串是用空格分隔的一系列整数,写一个程序把其中的整数做如下重新排列打印出来:奇数显示在左侧、偶数显示在右侧。比如”2 7 8 3 22 9 5 11”显示成”7 3 9 2 8 22.”。注意事项:不要把Random的实例化放到循环里面!可以使用两个集合来降低产生随机数的循环次数。 Random在循环中会降低执行效率(每次new的时候的种子是一样的,当前时间。)(*)。泛型集合:使用泛型集合ListDictionaryList类似于ArrayList,ArrayList的升级版。各种方法:Sort()、Max()、Min()、Sum()Dictionary类似于H

57、ashtable,Hashtable的升级版。推荐使用泛型集合。T,K,V就像一把锁,锁住集合只能存某种特定的类型,这里的T,K,V也可以是其它字母 泛型集合案例:把分拣奇偶数的程序用泛型实现。List练习1:将int数组中的奇数放到一个新的int数组中返回。练习2:从一个整数的List中取出最大数(找最大值)。别用max方法。练习:把123转换为:壹贰叁。Dictionary练习:计算字符串中每种字母出现的次数(面试题)。 “ e ,to Chinaworld”,不区分大小写,打印“W2”“e 2”“o 3” 提示:Dictionary,char的很多静态方法。char.IsLetter()

58、案例:简繁体转换 。Dictionary。课下练习:英汉翻译。WinForm做。发英汉词典txt。课下练习:火星文翻译器。发字库。(作业。)案例:编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期,比如:二零一二年十二月月二十一日要转换为2012-12-21。(处理“十”的问题:1.*月十日;2.*月十三日;3.*月二十三日;4.*月三十日;)4中情况对“十”的不同翻译。110;21;3不翻译;40【年部分不可能出现十,都出现在了月与日部分。】测试数据:二零一二年十二月二十一日(2012年12月21日)、二零零九年七月九日、二零一零年十月二十四日、二零一零年十月二十日补充(装箱、拆

59、箱):box、unbox比较泛型集合List与ArrayList的性能。循环增加整数、引用类型比较性能。(装箱、拆箱 )见备注。/1.装箱、拆箱必须是: 值类型引用类型 或 引用类型值类型。 /object,接口。值类型是可以实现接口。 /Person p=new Student();/这个叫隐式类型转换,不叫装箱。 /Student stu=(Student)p;/这个叫显示类型转换,不叫拆箱。 /int类型为什么能装箱到object类型,但不能装箱到string类型或Person类型, /因为object类型是int类型的父类。 /2.拆箱时,必须用装箱时的类型来拆箱 /装箱时如果是int

60、,拆箱必须用int,不能用double /3.方法重载时,如果具有该类型的重载,那么就不叫拆箱或装箱。int n=10; Console.WriteLine(n);/没有发生装箱,因为方法重载。/4.接口与值类型之间的装箱与拆箱。 /5.字符串连接:1+”aaa”+100,发生了几次装箱 / string.Concat(s1, s2, n3, d4);判断是否发生了装箱,及次数。= /装箱了吗? string s = 123; int n = int.Parse(s); /拆箱了吗? string s1 = n.ToString();代码阅读/1.以下代码进行了几次装箱?(3次装箱,1次拆箱,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论