黑马五期net基础加强_第1页
黑马五期net基础加强_第2页
黑马五期net基础加强_第3页
黑马五期net基础加强_第4页
黑马五期net基础加强_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

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

文档简介

北京传智播客教育北京传智播客教育.Net基础加强讲师:赵晓虎北京传智播客教育课前准备给大家一个建议:有问题多问,同样的时间,问的多就学的多。本课程目的:让大家都具有最基本的编程水平,保证能正常进行后续的课程。基础不好的同学抓紧复习(一次很好的机会)基础好的同学(复习,看参考书籍,继续提升,有问题可以问)《C#图解教程》、《CSharpLanguageSpecification.doc》【C:\ProgramFiles\MicrosoftVisualStudio10.0\VC#\Specifications\2052\CSharpLanguageSpecification.doc】在vs的安装目录下。可以一章一章的看,也可以讲到哪里看到哪里。编程到底怎么学?那么多语言该学哪门?老杨的一个经典比喻:选择一种语言→泡妞。多做练习,就像游泳。反复练习,就像打铁。反复捶打,去除杂质,保留精华。书要越看越薄。温故而知新。做课堂笔记(听课优先,然后做笔记)北京传智播客教育课前说明课程内容中大部分是所有同学都需要掌握的,但是对于部分技术水平比较好的同学为了让其就业会有更高的薪资,所以课程中有一部分内容是相对比较难的,对于这部分内容ppt上会加*,加*的内容不要求所有同学都掌握。为了保证毕业后都能找到一份工作,所以建议大家应该把必须掌握的知识都掌握了以后再考虑加*的内容。北京传智播客教育复习(参考:基础知识复习.doc)交换两个变量的值。(如果会使用ref,则用方法做,传递2个int参数。)

intnum1=5;intnum2=6;通过程序交换让num1=6,num2=5;用方法实现(注:考虑方法的参数、返回值是什么?):求两个数的最大值(传递两个int类型参数)。扩展:(求三个数最大值,params)求1-100之间所有奇数的和。找胖子,{200,120,90,180,110},找最胖的人.(求最大值,参数是int类型数组。)不能调用数组的Max()方法。c#时间格式转换汉字大写比如:“2011年6月4日”转换成“二零一一年六月四日”。(参考提示:把字符串作为char数组来用,判断如果是2→’二’,0→’零’,1→‘一’…)。暂时不考虑10日、13日、23日等问题。创建一个Person类,属性:姓名、性别、年龄;方法:SayHi()。再创建一个Employee类继承Person类,扩展属性Salary,重写SayHi方法。新建控制台应用程序来完成以上问题。北京传智播客教育再次强调代码规范规则(法律,必须遵守否则报错)语法规范(道德,大家都喜欢有道德的人。)注释骆驼命名:第一个单词首字母小写,之后的单词首字母大写userName、userPassword、realName…(普通变量(局部变量)、字段)帕斯卡命名:第一个单词首字母大写,之后的单词首字母大写GetMax()、ChangeName()…(方法名、类名、属性名)定义的变量或者方法名字要有意义。方法名:动词。Write()、Open()、Close()、Dispose()、GetUserId()、…(方法都是要做一件事情)变量名:按功能命名、按方法的返回值内容命名(userName=GetUserName();)上课记笔记!北京传智播客教育复习WinForm桌面程序,桌面应用程序是相对于Web应用程序而言的。桌面应用程序:QQ、迅雷、Office…Web应用程序:网上银行系统、163邮箱系统、电子商务网站、网上预约挂号平台…WinForm的控件TextBox、Timer、CheckBox、TreeView、GroupBox、Label、Button、RadioButton、CheckBoxList、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.exec:\program.cs】3>程序运行时通过JIT编译(JustInTime)即时编译,将程序集编译为cpu能理解的机器码,这时cpu才能执行。(这个编译过程会与当前机器有关(根据当前机器的内存、cpu等))。ngen.exe北京传智播客教育面向对象(OO)什么是面向对象?一种分析问题的方式(增强了程序的可扩展性)。面向对象三大特性:封装、继承、多态。什么是类?什么是对象?类和对象的区别?如何写一个汽车类?类是模具,创建对象的模具,抽象的。类是一种数据类型,用户自定义的数据类型类组成:字段、属性、方法、构造函数等对象是具体的,是类的具体实例。对象具有属性(特征)和方法(行为)类中包含了数据(用字段表示)与行为(用方法(函数、功能)表示,方法为一块具有名称的代码)案例:创建学生类,老师类,通过构造函数初始化类内部字段this,当前对象案例:使用面向对象方式重做计算器v2.0。(写一个Calculator类,里面有几个计算方法。)实现WinForm版本与控制台版本。练习:猜拳游戏。先分析类和对象。实现WinForm版本与控制台版本。北京传智播客教育属性、索引器属性索引器北京传智播客教育添加引用与导入命名空间的区别添加引用(前提)添加程序集导入命名空间namespace(ctrl+.或shift+alt+F10)为什么在另一个项目中建的类,添加引用后还是不能使用?(类的访问修饰符默认:internal,改成public)“参数”与“返回值”参数的个数、类型与返回值没有任何半毛钱关系。控制台应用程序中不要新建Form再次说明this的使用,通过this访问类的属性。this.Fist北京传智播客教育变量作用域变量作用域:离声明该变量最近的那对包含声明语句的大括号内部。成员变量—直接属于某个类,作用域在该类内部。成员变量使用前如果不赋值,默认会有一个初始值。string→null;int→0;bool→false局部变量—声明该变量的块语句或方法结束的封闭括号之前的作用域内(使用之前必须得赋值。)思考:publicvoidM1(){intn=10;if(n>5){intn=100;}}//对吗?北京传智播客教育关于构造函数补充publicclassC1{intx=100;//此时其实也是在构造函数中为x赋值。}通过reflector查看生成源码。北京传智播客教育封装提问:大家觉得什么是封装?遥控器刚出来时候很神奇,点个按钮就能换电视台、切音量、关电视。而我们使用遥控器的人不需要知道他是怎么实现的(你只需要知道每个按钮的功能即可)和遥控器类似,面向对象的封装就是把事物的状态和行为封装在类中,使用类的人不需要知道类内部是怎么实现的,只要调用其中的属性和方法实现功能就行。就像你使用遥控,不需要知道他是怎么控制电视的,只要知道按钮能换台就行类和对象本身就是封装的体现。1.属性封装了字段、2.方法的多个参数封装成了一个对象、3.将一堆代码封装到了一个方法中、4.将一些功能封装到了几个类中、5.将一些具有相同功能的代码封装到了一个程序集中(dll、exe),并且对外提供统一的访问接口。(属性名、方法名等。)北京传智播客教育继承(是指类与类之间的关系。)车(Vehicle)

—卡车(Truck)轻型卡车重型卡车—轿车(Car)--小轿车面包车如何判断一个继承关系是否合理?子类isa父类。卡车和轿车都是车,都有轮子、发动机。但是卡车又能拉货,轿车能拉人BaseClass→基类、ParentClass→父类DerivedClass→派生类、ChildClass→子类为什么要继承?继承带给我们的好处?代码重用LSP里氏替换原则(通过代码说明一下,声明父类类型变量,指向子类类型对象,以及调用方法时的一些问题)、多态。(程序的可扩展性、灵活性)方法重写override。虚方法的原理:虚方法表。子类继承父类的属性和方法,使创建子类变得很简单,实现了代码重用、以及多态。类的单根继承性、传递性、继承时构造函数的问题。构造函数不能被继承。所有的类都直接或间接的继承自object。查看IL代码。北京传智播客教育关于继承的那些事儿案例:定义学生类(姓名、性别、年龄、成绩,Hello方法)、老师类(姓名、性别、年龄、工资、Hello方法)从中抽象出一个父类,通过构造函数给子类字段赋值protected只能在子类内部和当前类内部中使用可以在类内部以及所有子类中(内部)访问。this:1.作为当前类的对象,可以调用类中的成员。this.成员(调用成员,自己)2.调用本类的其他构造函数。:this()(调用构造函数,自己)reflector查看base :1.调用父类中的成员(在子类重写父类成员或者子类使用new关键字隐藏了父类成员时,调用父类成员)base点不出子类独有成员。2.调用父类中的构造函数(调用构造函数,父类)当调用从父类中继承过来的成员的时候,如果子类没有重写则this.成员;与base.成员;没有区别。如果子类重写了父类成员,则this.成员;调用的是子类重写以后的。base.成员;调用的依然是父类的成员。子类构造函数必须指明调用父类哪个构造函数北京传智播客教育练习练习:定义父亲类Father(姓lastName,财产property,血型bloodType),儿子Son类(玩游戏PlayGame方法),女儿Daughter类(跳舞Dance方法),调用父类构造函数(:base())给子类字段赋值练习:定义汽车类Vehicle属性(brand(品牌),color(颜色))方法run,子类卡车(Truck)属性weight载重方法拉货,轿车(Car)属性passenger载客数量方法载客练习:升级猜拳游戏(加入父类【继承】)注意:当this与base作为调用构造函数的语法的时候,参数的传递可能会有的疑惑。:base(参数,参数)类中的成员如果不写访问修饰符默认是private.北京传智播客教育关于继承中“私有成员”能否被继承的问题我观点:私有成员不能被子类继承。原因:1.虽然子类继承父类后,在创建子类对象的时候,父类中的那些私有成员,也被分配了内存(子类中也有)。2.但是,继承只是面向对象中的一个概念,目的是为了子类使用(多态、代码重用),私有成员即便继承了,子类中也不能访问,所以在面向对象中,继承了但不能访问,没有意义。北京传智播客教育访问修饰符作用:指明程序的其他部分如何访问该成员。共5种:private当前类中可以访问,类中成员的默认访问修饰符。protected当前类及子类中可以访问(在继承中用。)internal当前程序集内部可以访问protectedinternal当前程序集或子类中(不同程序集也可以访问)。public任何地方北京传智播客教育访问级别约束访问级别约束子类的访问级别不能比父类的高。(会暴露父类的成员)类中属性或字段的访问级别不能比所对应的类型访问级别高。方法的访问级别不能比方法的参数和返回值的访问级别高。用于解决“可访问性不一致”的错误。北京传智播客教育实现多态的手段1-虚方法virtualPerson→Chinese→American→Korean,每个国家的人都有一个说出自己国籍的方法。当有一个Person[]的时候,循环现实每个国家的人。虚方法可以给父类中的方法一个实现,比如ToString()方法虚方法必须有实现部分,哪怕是空实现。案例:员工类、部门经理类(部门经理也是员工,所以要继承自员工类。员工有上班打卡的方法。用类来模拟。练习:把Person类中的SayHello改为虚方法让其默认为学生的,增加老师、司机类。虚方法和抽象方法的区别。见备注北京传智播客教育方法重写注意事项子类重写父类方法时,必须与父类保持一致的方法签名与返回值类型。即:方法名、返回值类型、参数列表都必须保持一致。[访问修饰符也得一致]“方法签名”:一般是指方法的【名称】+方法的【参数列表】,不包含方法返回值类型北京传智播客教育静态成员-通过类名访问、实例成员-通过对象访问先通过窗体之间共享值,以及工具类,说明为什么要用static。C#中声明的所有的变量都需要在类型中,不能在类型以外直接声明全局变量,与c或c++不同。没有全局变量的概念。静态成员是与“类”相关,而非与“实例”相关。普通类中的静态成员static只能通过类名访问静态方法中只能访问静态成员,或通过对象访问实例成员。多个对象共享同一个静态成员。静态类(一般都用作工具类,里面都是一些工具函数)Math、Console、Convert等都是静态类。静态类中只能包括静态成员静态构造函数不能有参数、不能有访问修饰符(默认为private)。静态构造函数在第一次使用该静态类的时候只执行一次。静态成员属于类所有,非静态成员属于类的实例所有C#静态方法属于类所有,类实例化前即可使用在实例方法中可以直接调用静态方法,在静态方法中不可以直接调用实例方法静态方法和静态变量创建后始终使用同一块内存(静态存储区),而使用实例的方式会创建多个内存少使用静态类,静态类、静态成员所分配的内存在程序退出时才会释放。北京传智播客教育什么时候使用静态成员、静态类1.在实例类中使用静态成员。账户类:(实例类)classAccount{UserName//用户名Address//地址Total//存款额staticRate//利率,由于该银行采用浮动利率,每天的利率根据当天的挂牌利率(基准利率)来计算,所以“利率”不适合作为每个对象单独的一个数据。}//当多个对象共享同一个数据的时候就可以在实例类中加入静态成员。2.使用静态类在项目中需要频繁用到的一些工具类,例如:Math、Console、Convert等。或者模拟“全局变量”的时候。北京传智播客教育静态类的继承问题(*)静态类不能被其他类继承,静态成员亦不能被继承(访问的是同一个),备注1.静态类只能继承自Object类。(静态类不能继承自其它类。)继承(多态)、静态本身就是相反的。静态类不能实现任何接口,(因为接口中的成员都是实例成员。*)sealed:(*)密封类,不能被继承。sealed关键字,表示类不能被继承。(密封类)密封类表示不能被继承。String类。.net系统中本身对字符串有很多特殊处理(为String开了很多“绿灯”,String有很多特权,比如:不可变性,字符串池等等。),防止别的类继承后造成混乱。商业问题。禁止子类重写父类的方法。静态类的本质abstract+sealed(*,知道即可)static静态类不能被实例化:abstract静态类不能被继承:sealed北京传智播客教育多态:为了程序的可扩展性。开放封闭原则(对修改封闭,对扩展开放。)先看看ToString()方法。普通类的ToString()、Int32多态就是指不同对象收到相同消息时,会产生不同行为,同一个类在不同的场合下表现出不同的行为特征多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。里氏替换原则父类引用指向子类对象Personp=newChinese();(隐式类型转换)父类对象不能够替换子类Chinesec=(Chinese)newPerson();(×)is-a:可以用来验证继承关系中是否合理。(cando,验证实现接口是否合理*)if(objis

类型A)//obj是父类类型对象,”类型A”是子类类型。关键字as(类型转换)、is(通常类型转换前需要通过is来判断一下类型。)北京传智播客教育实现多态的方式virtual,子类重写父类中的方法。abstract,子类重写父类中的方法。接口,实现接口的类,将接口中的方法实现。北京传智播客教育怎么实现多态1-抽象类abstract抽象类不能被实例化。抽象类中可以有普通成员。抽象类存在的意义:1.抽象类不能被实例化,只能被其他类继承2.继承抽象类的子类必须把抽象类中的所有抽象成员都重写(实现)(除非子类也是抽象类。)3.抽象类就是为了重写→多态(代码重用)。4.抽象类中可以有实例成员也可以有抽象成员。什么是抽象类(光说不做)不能被实例化的类(不能new)抽象类的特点见备注案例:学生类和老师类中抽象出父类(Person),并让学生和老师都要具有SayHello和起立Standup两个方法练习1:动物Animal

都有吃Eat和叫Bark的方法,狗Dog和猫Cat叫的方法不一样.父类中没有默认的实现所哟考虑用抽象方法。练习2:计算形状Shape(圆Circle,矩形Square

,正方形Rectangle)的面积、周长北京传智播客教育知识点补充1:关于抽象类知识点补充抽象类中的抽象成员不能使用private访问修饰符,可以使用其他访问修饰符。常见问题:当鼠标放到父类上时,没有自动提示“必须实现父类中的抽象方法”,原因可能是父类不是abstract或,父类中没有abstract成员。北京传智播客教育抽象类练习要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的移动存储设备,所以计算机必须有扩展性,能与目前未知而以后可能会出现的存储设备进行数据交换。各个存储设备间读、写的实现方法不同,U盘和移动硬盘只有这两个方法,MP3Player还有一个PlayMusic方法橡皮鸭子(RubberDuck)、真实的鸭子(RealDuck)。两个鸭子都会游泳,而橡皮鸭子和真实的鸭子都会叫,只是叫声不一样,橡皮鸭子“唧唧”叫,真实地鸭子“嘎嘎”叫北京传智播客教育new(*)隐藏、截断(用的不多,了解)方法的隐藏Swim方法是子类特有classRubberDuck:Duck

{

//方法的隐藏

//子类特有的方法,只不过方法名和父类重名了publicnewvoidSwim()

{Console.WriteLine("swim被改变了");

}}如果一个方法在子类中被重写Duckduck=newRubberDuck();duck.Bark()调用子类的方法,因为被重写。了抽象方法子类必须重写所以不能用new.使用第三方dll的时候,原来没有SayHi方法,自己继承后加了个SayHi(),后来第三方dll更新,也加了个SayHi(),继承后的类中现在就得用new了。北京传智播客教育面向对象计算器使用面向对象的方式实现+、-、*、/的计算器1、找对象2、抽象出父类,让子类都有计算能力3、实现子类4、产生子类对象的工厂5、调用哪部分是可能扩展的就尝试将该部分抽象(封装变化,将变化的地方抽象出来),以便多态。北京传智播客教育设计模式(GOF23种设计模式)世上本没路,走的人多了也就成了路设计本没模式,程序写多了也就有了模式总结前人的思想,总结出的解决某一类问题的通用方法刚才的计算器就是设计模式中简单工厂设计模式

各种设计模式的本质都是:多态。充分理解了多态,再看设计模式就会觉得轻松很多。北京传智播客教育值类型引用类型值类型均隐式派生自System.ValueType数值类型、bool、结构、枚举查看IL,隐式继承自ValueType引用类型派生自System.Object字符串、数组、类、接口等查看IL隐式继承自Object引用类型变量的赋值只复制对对象的引用。值类型变量赋值会拷贝一个副本。北京传智播客教育值类型、引用类型作为参数传递值传递,刚才讨论的参数传递方式都是值传递。引用传递,ref,传递的是变量的地址。值传递(普通的参数传递)引用传递(ref)(*)值类型、引用类型值传递、引用传递值传递:引用类型、值类型引用传递(ref):引用类型、值类型。北京传智播客教育怎么实现多态2-接口什么是接口?接口就是一种规范,协议(*),约定好遵守某种规范就可以写通用的代码。定义了一组具有各种功能的方法。(只是一种能力,没有具体实现,像抽象方法一样,“光说不做”)接口存在的意义:多态。多态的意义:程序可扩展性。最终→节省成本,提高效率。接口解决了类的多继承的问题接口解决了类继承以后体积庞大的问题。接口之间可以实现多继承先从语法角度看一下接口,与抽象类类似。北京传智播客教育案例(继承了一个类,同时实现了其他接口)鸟-麻雀sparrow['spærəu],鸵鸟ostrich['ɔstritʃ],企鹅penguin['pengwin],鹦鹉parrot['pærət]

鸟能飞,鸵鸟,企鹅不能。。。你怎么办子类继承抽象类,实现接口接口中的成员必须不能有实现,接口不能实例化。接口中的成员不能有访问修饰符,隐式公开public接口中可以有属性、方法、索引器等(其实都是方法),但不能有字段接口中的所有成员必须被子类中全部实现,除非子类是抽象类,把接口中的成员标记为抽象的。练习:从学生,老师,校长类中抽象出人的类,学生和老师都有收作业的方法,但是校长不会收作业北京传智播客教育再看一个接口案例回顾:接口是一种规范。什么是规范?理解规范的意义。规范,就是告诉我们要做什么,具有什么能力。在程序中为什么需要规范?(多态,可以让我们编写通用的代码,提高程序的可扩展性)接口就像“法律”。登记方法(接口作为参数,实现多态)DengJi(Personperson)//人口登记,Person是抽象类DengJi(Carcar)//汽车也要登记DengJi(Househouse)//房子也要登记。IJiKouDengJi(IJieKoujk);北京传智播客教育练习橡皮rubber鸭子、木wood鸭子、真实的鸭子realduck。三个鸭子都会游泳,而橡皮鸭子和真实的鸭子都会叫,只是叫声不一样,橡皮鸭子“唧唧”叫,真实地鸭子“嘎嘎”叫,木鸭子不会叫.把抽象类变成接口。北京传智播客教育显示实现接口(*)为什么要显示实现接口?方法重名后的解决办法。显示实现接口后,只能通过接口来调用。不能通过类对象本身来调用(显示实现的接口,查看IL是private的,防止通过类来调用)为什么要有“显示实现接口”?可以解决重名方法的问题。什么是“显示实现接口”?实现接口中的方法时用:接口名.方法名(),并且没有访问修饰符,private“显示实现接口”后怎么调用?只能通过接口变量来调用,因为显示实现接口默认为private。北京传智播客教育接口的特点总结接口是一种规范。为了多态。接口不能被实例化。接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,不能修改。(默认为public)接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。接口中只能有方法、属性、索引器、事件,不能有“字段”。接口与接口之间可以继承,并且可以多继承。实现接口的子类必须实现该接口的全部成员。一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么语法上A必须写在IA的前面。classMyClass:A,IA{},因为类是单继承的。当一个抽象类实现接口的时候,如果不想把接口中的成员实现,可以把该成员实现为abstract。(抽象类也能实现接口,用abstrac标记)“显示实现接口”,只能通过接口变量来调用(因为显示实现接口后成员为private)。北京传智播客教育使用接口的建议面向抽象编程,使用抽象(父类、抽象类、接口)不使用具体。“向上转型”在编程时:接口→抽象类→父类→具体类(在定义方法参数、返回值、声明变量的时候能用抽象就不要用具体。)能使用接口就不用抽象类,能使用抽象类就不用类,能用父类就不用子类。避免定义“体积庞大的接口”、“多功能接口”,会造成“接口污染”。只把相关联的一组成员定义到一个接口中(尽量在接口中少定义成员)。单一职责原则定义多个职责单一的接口(小接口)(组合使用)。(印刷术与活字印刷术)随着学习的深入再继续体会接口的作用。北京传智播客教育抽象类复习、简单工厂设计模式复习(*)抽象类:不能被实例化,需要被继承。多态。子类必须重写父类中的所有的抽象成员,除非:子类也是一个抽象类。抽象成员在父类中不能有任何实现。抽象类中可以有实例成员。抽象成员的访问修饰符不能是private抽象成员只能写在抽象类中。abstract作业:通过案例笔记本电脑的选择。笔记本电脑父类NoteBook、不同品牌的笔记本产品。(继承+简单工厂)北京传智播客教育接口复习(*)定义接口的语法(interface)接口中只能包含方法、属性、索引器、事件。不能包含字段。见备注1(貌似事件像一个字段?其实是两个方法。reflector查看源码)。接口中的成员不能有任何的实现(真正的“光说不做”。思考这样做的意义。联想抽象类中的抽象方法。)接口中的成员不能写访问修饰符。使用接口的语法一个类可以实现多个接口。实现接口的类,必须把接口中的所有成员都实现。子类实现接口中的成员时,不能修改成员的访问修饰符、参数列表、方法名等。(与方法重写一样)北京传智播客教育面试题1.如何使用virtual和override?Personper=newStudent();per.SayHI()调用的子类重写的SayHi方法(语法、应用(多态))2.如何使用abstract和override?3.“方法重载overload”、“方法重写override"、"隐藏new"是同一个概念吗?4.抽象类和接口的区别?见备注1.抽象类适用于同一系列,并且有需要继承的成员。接口适用于不同系列的类具有相同的动作(行为、动作、方法)。对于不是相同的系列,但具有相同的行为,这个就考虑使用接口。接口解决了类不能多继承问题。北京传智播客教育知识补充:标志枚举(*)1.枚举:(QQ的状态,在线、隐身、忙碌…)PublicenumMyColor:byte{//byte表示限制枚举中的值。White,Red=100,Green}//枚举对应的都是一个常量值,所以编译的时候就会替换成对应的数值。获取当前枚举的基础值类型:Enum.GetUnderlyingType(typeof(MyColor))【byte】,枚举基础类型可以是除了char以外的任何整型,准许使用的枚举类型有byte、sbyte、short、ushort、int、uint、long或ulong。1>将枚举转换为数值:(int)MyColor.Red;2>将枚举转换为字符串:MyColor.Red.ToString()3>将字符串转换为枚举:MyColormc=(MyColor)Enum.Parse(typeof(MyColor),"Red");2.标志枚举:(当可以具有多个状态时,普通枚举就不够用了(状态可以组合))FileAttributes,普通枚举中的每个值是互斥的,而标志枚举中每个值是可以互相组合的。见备注1FlagsAttribute特性。让两个标志枚举组合:枚举.V1|枚举.V2判断当前值中是否包含V1:枚举mj=…;if(mj&枚举.V1==枚举.V1)表示存在V1北京传智播客教育结构体(*)值类型在没有面向对象、在没有类的情况下如何组织一些相关的数据?一种值类型,不具有面向对象的特征,通常用来封装小型相关变结构体是一个值类型。(非常像类的量组)System.Drawing.Point、Size、Color注意:结构使用时可以new,也可以不new。如果不new,则使用前必须为结构成员赋值。(当结构中有属性,并且声明结构后需要使用到属性时,必须new.)在结构中不能为变量直接赋初值,除非const、static结构可以实现接口,但不能继承。结构的使用方法与类很相似。什么时候使用类?什么时候使用结构?1.是否需要使用面向对象的特性:封装、继承、多态。,如果需要在某些情况下被继承或者使用多态等特性则只能用类。当类型中(类或结构)的成员比较多的时候,则考虑使用类。结构与类的详细区别见备注。使用结构时注意装箱、拆箱的性能差异。北京传智播客教育类型转换CAST隐式类型转换doublenum=10;//sizeof(double)/sizeof(int)显示类型转换intn=(int)num;把学生转换为人是隐式转换,把人转换为学生则是显式转换(强制转换)Students=newStudent();Personp=s;//隐式类型转换Studentstu=(Student)p;//显示类型转换、objas类型。只有在内存存储上存在交集的类型之间才能进行隐式转换。不能用Cast转换string/int,只能用Convert。Convert.ToInt32/Convert.ToString北京传智播客教育补充:Convert将任意类型转换成字符串:ToString()将字符串转换成“数值类型”(int、float、double):int.Parse(stringstr);、int.TryParse(stringstr,outintn);//很常用,推荐。double.Parse(stringstr);、double.TryParse(stringstr,outdoubled);……Parse()转换失败报异常,TryParse()转换失败不报异常。再说as与直接类型转换:(*)if(pisStudent){Studentstu=(Student)p;}CLR会进行两次类型检查if(检查一次){//再检查一次}通过GetType(),GetType()不允许重写。Studentstu=pasStudent;//推荐,效率高于第一种,如果转换失败返回null,而不会报异常。北京传智播客教育类型转换ConvertConvert考虑数据意义的转换。Convert是一个加工、改造的过程。若要进行其它类型的转换可以使用Convert.ToInt32、Convert.ToString等。Convert可以把object类型转换为其它类型stringstr=null;

intnum=0;

num=Convert.ToInt32(str);

Console.Write(num+“\r\n”);

num=Int32.Parse(str);

Console.Write(num+“\r\n”);

Int32.TryParse(str,outnum);

Console.Write(num+"\r\n");当遇到类型转换的时候不知道该怎么转,可以去Convert中找找。北京传智播客教育异常处理1什么是异常?程序运行时发生的错误。(错误的出现并不总是程序员人的原因,有时应用程序会因为最终用户或运行代码的环境改变而发生错误。比如:1.连接数据库时数据库服务器停电了;2.操作文件时文件没了、权限不足等;3.计算器用户输入的被除数是0;4.使用对象时对象为null;等等。).net为我们把“发现错误(try)”的代码与“处理错误(catch)”的代码分离开来。异常处理的一般代码模式:try{…可能发生异常的代码…}catch{…对异常的处理…}finally{…无论是否发生异常、是否捕获异常都会执行的代码…}try块:可能出问题的代码。当遇到异常时,后续代码不执行。catch块:对异常的处理。记录日志(log4net),继续向上抛出等操作。(只有发生了异常,才会执行。)finally块:代码清理、资源释放等。无论是否发生异常都会执行。案例:intx=5;inty=0;intz=x/y;程序运行运行时出错,后续的内容无法运行程序一旦有一个功能发生异常,整个程序崩溃其它功能也无法正常运行北京传智播客教育异常处理2异常处理代码的其他几种形式:try→多个catch→一个finallytry→(1个或多个catch),多个catch的顺序问题。可以没有finally。try→finally(只能有一个),没有catch也可以。注意点:发生异常后,try块中,异常代码后的代码不会执行。finally块中的代码,无论是否发生异常都会执行。finally中不能写return语句。try中有return语句,finally也会执行即便没有catch(或者没有找到合适的catch块),finally中的代码也会执行,但finally之后的代码则不会。(见备注1.)Exceptionex异常也是对象,封装了异常发生时的一些信息。Exception类主要属性:Message、StackTrace、InnerException(*)扔出自己的异常,扔:throw,抓住:catch建议:通过逻辑判断(if-else)减少异常发生的可能性!尽量避免使用“异常处理”。在多级方法嵌套调用的时候,如果发生了异常,则会终止所有相关方法的调用,并且释放相关的资源。北京传智播客教育代码观察static

intGetNumber(){

try{

intn1=10;

intn2=0;

intn3=n1/n2;

return100;}

catch(Exceptionex){

Console.WriteLine("*******异常了*********");

return1000;}

finally{

Console.WriteLine("finally中的代码!!!!");}}问题:1.finally中的代码会不会执行?2.方法会不会返回值?3.如果有返回值,是多少?北京传智播客教育函数返回值(函数参数前的修饰符)params

可变参数无论有几个参数,必须出现在参数列表的最后。可以为可变参数直接传递一个对应类型的数组。ref

仅仅是一个地址,引用传递,可以把值传递强制改为引用传递out

让函数可以输出多个值1.在方法中必须为out参数赋值2.out参数的变量在传递之前不需要赋值,即使赋值了也不能在方法中使用。(赋值没意义)ref参数在传递之前必须赋值在方法中可以不为ref参数赋值,可以直接使用。ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。北京传智播客教育ref与out案例案例1:两个int变量的交换,用方法做。ref?out案例2:模拟登陆,返回登陆是否成功(bool),如果登陆失败,提示用户是用户名错误还是密码错误”admin”,“888888”【两个返回值,一个bool,一个string】ref?outswap(intn,intm){//交换两个变量}cw(n,m)boollogin(stringuid,stringpwd){}北京传智播客教育方法重载1.方法名称相同2.方法签名不同方法名参数类型、个数、(顺序)参数的修饰符(ref、out、params)不包含方法返回值。北京传智播客教育Equals、==、ReferenceEquals方法比较两个对象是否为同一个对象?什么是同一个对象?为什么字符串的Equals和别的不一样?//string的Equals方法判断的是字符串的内容是否相同(重写了Object中的Equals方法。)

//而object中的Equals方法是判断对象的地址是否相同查看String类的==运算符,内部调用的也是Equalsobject.Equals();//用这个来比较两个对象。//补充一个:如何判断str1与str2是否为同一个对象?Equals已经不可靠了。"=="也不靠谱了。("=="运算符重载后也是调用的EqualsHelper()来判断的,与Equals(string)方法一样。)判断两个对象是否相同要用:object.object.ReferenceEquals();北京传智播客教育常用类库String学习.net就是学习它的无数个类库怎么用,先看两个简单的字符串的一些特性:不可变性(ToUpper演示)字符串暂存池(拘留池)(针对字符串常量)内部维护一个哈希表key为字符串,value是地址。每次为一个新变量赋值都会找key中是否有,如果有则直接把value中的地址赋值给新变量演示"abc"与控制台输入的"abc"与"a"+"b"+"c"与三个变量abc相加是否为同一个对象,以此说明只针对常量。(*)(暂存、拘留、驻留)字符串留用(Intern,针对变量常量,见备注1)。对于动态字符串本身在哈希表中没有,通过这种Intern可以添加到该哈希表中,目的为了提高性能。String.Intern(xx),

Intern方法使用暂存池来搜索与str值相等的字符串。如果存在这样的字符串,则返回暂存池中它的引用。如果不存在,则向暂存池添加对str的引用,然后返回该引用。String.IsInterned(xx),此方法在暂存池中查找str。如果已经将str放入暂存池中,则返回对此实例的引用;否则返回nullNothingnullptrnull引用北京传智播客教育String字符串,字符串可以看成字符数组,不可变特性(通过for循环,修改string中的元素,失败!)。属性Length//获得字符串中字符的个数。”aA我你他”→5方法IsNullOrEmpty() 静态方法,判断为null或者为””(静态方法)ToCharArray()将string转换为char[]ToLower() 小写,必须接收返回值。(因为:字符串的不可变);ToUpper()大写。Equals() 比较两个字符串是否相同。忽略大小写的比较,paration.IndexOf()如果没有找到对应的数据,返回-1.//面试题:统计一个字符串中,”天安门”出现的次数。 LastIndexOf() 如果没有找到对应的数据,返回-1Substring() //2个重载,截取字符串。Split()//分割字符串。 Join() 静态方法Format () 静态方法Replace()北京传智播客教育补充注意:对字符串的操作一定要用变量接收返回值。(字符串是不能变的,每次都是构建一个新的字符串)strings=“abc”;s=s.Replace(‘c’,’C’);北京传智播客教育字符串的处理练习1课上练习1:接收用户输入的字符串,将其中的字符以与输入相反的顺序输出。"abc"→"cba“.课上练习2:接收用户输入的一句英文,将其中的单词以反序输出。“Iloveyou"→“Ievoluoy"课上练习3:”2012年12月21日”从日期字符串中把年月日分别取出来,打印到控制台课上练习4:把csv文件中的联系人姓名和电话显示出来。简单模拟csv文件,csv文件就是使用,分割数据的文本,输出:姓名:张三电话:string[]lines=File.ReadAllLines(“1.csv”,Encoding.Default);//读取文件中的所有行,到数组中。北京传智播客教育字符串的处理练习2练习5:123-456---7---89-----123----2把类似的字符串中重复符号”-”去掉,既得到123-456-7-89-123-2.split()、StringSplitOptions.RemoveEmptyEntriesJoin()练习6:从文件路径中提取出文件名(包含后缀)。比如从c:\a\b.txt中提取出b.txt这个文件名出来。以后还会学更简单的方式:“正则表达式”,项目中我们用微软提供的:Path.GetFileName();(更简单。)练习7:“[port=21,type=ftp]”,这个字符串表示IP地址为的服务器的21端口提供的是ftp服务,其中如果“,type=ftp”部分被省略,则默认为http服务。请用程序解析此字符串,然后打印出“IP地址为***的服务器的***端口提供的服务为***”line.Contains(“type=”)。[port=21]练习8:求员工工资文件中,员工的最高工资、最低工资、平均工资北京传智播客教育作业:“北京传智播客软件培训,传智播客.net培训,传智播客Java培训。传智播客官网:。北京传智播客欢迎您。”。在以上字符串中请统计出”传智播客”出现的次数。找IndexOf()的重载。北京传智播客教育常用类库StringBuilderStringBuilder高效的字符串操作当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作。String对象是不可变的。每次使用System.String类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常大。如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类。例如,当在一个循环中将许多字符串连接在一起时,使用StringBuilder类可以提升性能。StringBuilder!=String//将StringBuilder转换为String.用ToString();StringBuilder仅仅是拼接字符串的工具,大多数情况下还需要把StringBuilder转换为String.StringBuildersb=newStringBuilder();sb.Append();//追加字符串sb.ToString();//把StringBuilder转换为字符串。sb.Insert();sb.Replace();案例:使用程序拼html中的tableString大量拼接演示。北京传智播客教育垃圾回收(*)CLR的一个核心功能—垃圾回收。垃圾回收的目的:提高内存利用率。垃圾回收器,只回收托管堆中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等)。什么样的对象才会被回收?没有变量引用的对象。没有变量引用的对象,表示可以被回收了(null),断了线的风筝,再也回不来了。大学食堂(自己收盘子)、大排档(不需要程序员自己收盘子)什么时间回收?不确定,当程序需要新内存的时候开始执行回收。GC.Collect();//手动调用垃圾回收器。不建议使用,垃圾回收时会暂停一下(非常短暂)让程序自动去GC。垃圾回收器中“代”的概念:共3代:第0代、第1代、第2代。各代的回收频率:第0代最高,其次第1代,再次第2代。也就是说越老的对象生存几率越大。.net中垃圾回收机制:pact(标记和压缩),一开始假设所有对象都是垃圾。除了内存资源外的其他资源怎么办?~或者Dispose()弱引用:WeakReference,对于创建比较耗时的对象可以使用弱引用。见备注1.IsALive判断是否已死。“大对象”,objecto=newbyte[85000];>=85000字节的对象被视为大对象,直接分配在第2代,GC.GetGeneration(o);不要为为短时间使用的对象创建大对象,否则频繁回收第2代。北京传智播客教育.net中的集合集合命名空间:usingSystem.Collections;(非泛型集合)usingSystem.Collections.Generic;(泛型集合)常用集合“类似数组”集合:ArrayList、List<T>“键值对”集合(“哈希表”集合):Hashtable、Dictionary<K,V>“堆栈”集合:Stack、Stack<T>(LIFO)“队列”集合:Queue、Queue<T>(FIFO)“可排序键值对”集合:(插入、检索没有“哈希表”集合高效)SortedList、SortedList<K,V>(占用内存更少,可以通过索引访问)SortedDictionary<K,V>(占用内存更多,没有索引,但插入、删除元素的速度比SortedList快)Set集合:无序、不重复。HashSet<T>,可以将HashSet类视为不包含值的Dictionary集合。与List<T>类似。SortedSet<T>(.net4.0支持,有序无重复集合)“双向链表”集合:LinkedList<T>,增删速度快。北京传智播客教育集合类(增、删、查、改、遍历)

ArrayList、Hashtable、List<T>、Dictionary<K,V>数组特点:类型统一、长度固定。集合常用操作添加、遍历、移除命名空间System.Collections

ArrayList可变长度数组,使用类似于数组属性Capacity(集合中可以容纳元素的个数,翻倍增长);Count(集合中实际存放的元素的个数。)方法Add()AddRange(ICollectionc)

Remove()RemoveAt()Clear()Contains()ToArray()Sort()

排序\Reverse();//反转Hashtable键值对的集合,类似于字典,Hashtable在查找元素的时候,速度很快。Add(objectkey,objectvalue);hash[“key”]hash[“key”]=“修改”;.ContainsKey(“key”);Remove(“key”);遍历:hash.Keyshash.Values/DictionaryEntry键值对集合中的“键”,绝对不能重复。北京传智播客教育键值对集合原理示意图北京传智播客教育案例:两个(ArrayList)集合{“a”,“b”,“c”,“d”,“e”}和{“d”,“e”,“f”,“g”,“h”},把这两个集合去除重复项合并成一个。案例:随机生成10个1-100之间的数放到ArrayList中,要求这10个数不能重复,并且都是偶数(添加10次,可能循环很多次。)Randomrandom=newRandom();random.next(1,101);//随即生成1-100之间的数。练习:有一个字符串是用空格分隔的一系列整数,写一个程序把其中的整数做如下重新排列打印出来:奇数显示在左侧、偶数显示在右侧。比如”2783229511”显示成”7392822….”。注意事项:不要把Random的实例化放到循环里面!可以使用两个集合来降低产生随机数的循环次数。Random在循环中会降低执行效率(每次new的时候的种子是一样的,当前时间。)(*)。北京传智播客教育泛型集合:使用泛型集合List<T>\Dictionary<K,V>书橱命名空间System.Collections.GenericList<T>类似于ArrayList,ArrayList的升级版。各种方法:Sort()、Max()、Min()、Sum()…Dictionary<K,V>类似于Hashtable,Hashtable的升级版。推荐使用泛型集合。T,K,V就像一把锁,锁住集合只能存某种特定的类型,这里的T,K,V也可以是其它字母

泛型集合可以进行foreach遍历,是因为实现了IEnumerable<T>具有了GetEnumerator()方法先看foreach的本质。(*)北京传智播客教育泛型集合案例:把分拣奇偶数的程序用泛型实现。List<int>练习1:将int数组中的奇数放到一个新的int数组中返回。练习2:从一个整数的List<int>中取出最大数(找最大值)。别用max方法。练习:把123转换为:壹贰叁。Dictionary<char,char>练习:计算字符串中每种字母出现的次数(面试题)。“e,toChinaworld”,不区分大小写,打印“W2”“e2”“o3”……提示:Dictionary<char,int>,char的很多静态方法。char.IsLetter()案例:简繁体转换。Dictionary。课下练习:英汉翻译。WinForm做。发英汉词典txt。课下练习:火星文翻译器。发字库。(作业。)案例:编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期,比如:二零一二年十二月月二十一日要转换为2012-12-21。(处理“十”的问题:1.*月十日;2.*月十三日;3.*月二十三日;4.*月三十日;)4中情况对“十”的不同翻译。1→10;2→1;3→不翻译;4→0【年部分不可能出现’十’,都出现在了月与日部分。】测试数据:二零一二年十二月二十一日(2012年12月21日)、二零零九年七月九日、二零一零年十月二十四日、二零一零年十月二十日北京传智播客教育补充(装箱、拆箱):box、unbox比较泛型集合List<T>与ArrayList的性能。循环增加整数、引用类型比较性能。(装箱、拆箱)见备注。//1.装箱、拆箱必须是:值类型→引用类型或引用类型→值类型。

//object,接口。值类型是可以实现接口。

//Personp=newStudent();//这个叫隐式类型转换,不叫装箱。

//Studentstu=(Student)p;//这个叫显示类型转换,不叫拆箱。

//int类型为什么能装箱到object类型,但不能装箱到string类型或Person类型,

//因为object类型是int类型的父类。

//2.拆箱时,必须用装箱时的类型来拆箱

//装箱时如果是int,拆箱必须用int,不能用double

//3.方法重载时,如果具有该类型的重载,那么就不叫拆箱或装箱。intn=10;

Console.WriteLine(n);//没有发生装箱,因为方法重载。//4.接口与值类型之间的装箱与拆箱。

//5.字符串连接:1+”aaa”+100,发生了几次装箱

//string.Concat(s1,s2,n3,d4);判断是否发生了装箱,及次数。==============================================================//装箱了吗?strings="123";intn=int.Parse(s);//拆箱了吗?strings1=n.ToString();北京传智播客教育代码阅读//1.以下代码进行了几次装箱?(3次装箱,1次拆箱,注意数字与字符串相加,最终调用的是string.Contact())intn=10;objecto=n;n=100;Console.WriteLine(n+","+(int)o);Console.ReadKey();//通过Reflector查看,并说明为什么?//2.以下代码装箱了?如果发生了装箱,请说明哪句代码装箱了,为什么?(*)intn=10;strings1=n.ToString();strings2=n.GetType().ToString();//由于GetType()不是虚方法子类没有重写,所以调用时需要通过object来调用,查看ILConsole.WriteLine(s1+"\t\t\t"+s2);//3.以下代码有没有发生装箱,如果有,几次?strings1="a";intn1=10;doubled1=99.9;objecto=10;strings2="x";strings3=s1+n1+d1+o+s2;Console.WriteLine(s3);Console.ReadKey();北京传智播客教育var类型推断北京传智播客教育自定义泛型(*)使用泛型的好处:类比List<T>与ArrayList对于值类型与引用类型操作的性能差异(1.性能2.垃圾回收次数(装箱拆箱))。GC.CollectionCount(0)已经对第0代垃圾回收的次数。泛型的目的:还是代码重用。T:一般叫做“类型参数”,把数据类型作为参数传递。一般用T类表示或者以大写T开头的比如:TKey,TValue、TOutput、TResult…泛型,在.net2.0版本才开始引入。泛型类、泛型接口、泛型方法(泛型方法中的类型推断,参见备注1.)、泛型委托(*)===============使用where关键字进行类型约束=====================北京传智播客教育foreach(*)演示一下。不需要掌握。可枚举类型(具有GetEnumerator()方法)、枚举器(具有IEnumerator接口中的成员的类)IEnumerable实现该接口即为可枚举类型IEnumerator实现该接口为枚举器foreach遍历类型推断为object而不是实际类型,需要实现泛型版本的接口快捷语法:yield(yield含义:生产,出产,带来)yieldreturn表达式yieldbreak;当yield语句所在的方法的返回值为IEnumerable<T>时,表示自动生成一个可迭代类型当yield语句所在的方法的返回值为IEnumertor<T>时,表示自动生成一个迭代器通过yield快速为某类型创建正向与反向迭代器演示通过IEnumerator接口遍历序列。GetEnumerator()方法。foreach遍历修改数据???绝对不行。//1.foreach循环是只读的。不能用来修改数据。//2.foreach循环式只进的,并且是一条一条循环的。北京传智播客教育神奇的Dictionary自己动手写Dictionary<string,string>。Dictionary性能测试。为什么速度这么快?查字典为什么能这么快?目录中记录了每个汉字的页码,查找的时候先看汉字的页码,再翻到指定的页就可以非常快速的找到词条了。Dictionary中有一个存储键值对的区域,这个区域的每个存储单元有地址编号,根据hashCode算法,计算key的值的键值对应该存储的地址,将键值对放入指定的地址即可。查找的时候首先计算key的地址,就可以找到数据了。根据key找房间号,而不是逐个房间找。(*)为什么Dictionary这么快:当把一个kvp,采用一个固定算法(散列算法)根据key来计算这个kvp存放的地址。取的时候也是根据要找的key可以快速算出kvp存放的地址。散列算法。北京传智播客教育文件操作常用相关类File//操作文件,静态类,对文件整体操作。拷贝、删除、剪切等。Directory//操作目录(文件夹),静态类。DirectoryInfo//文件夹的一个“类”,用来描述一个文件夹对象(获取指定目录下的所有目录时返回一个DirectoryInfo数组

温馨提示

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

评论

0/150

提交评论