




已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北京传智播客教育 .net基础加强 讲师:赵晓虎 课前准备 给大家一个建议:有问题多问,同样的时间,问的多就学的 多。 本课程目的:让大家都具有最基本的编程水平,保证能正常 进行后续的课程。 基础不好的同学抓紧复习(一次很好的机会) 基础好的同学(复习,看参考书籍,继续提升,有问题可以 问) c#图解教程 c#入门经典 可以一章一章的看,也可以讲到哪里看到哪里。 编程到底怎么学?老杨的一个经典比喻:泡妞。 复习 交换两个变量的值,(如果会使用ref,则用方法做。) int num1 = 5;int num2=6; 通过程序交换让num1 = 6,num2=5; 用方法实现: 求两个数的最大值 。扩展:(求三个数最大值,params) 求1-100之间所有奇数的和。 找胖子,200,120,90,180,110,找最胖的人.(求最大值) c#时间格式转换汉字大写 比如: 2011年6月4日 转换成 二零一一 年六月四日。(把字符串作为数组来用,判断如果是0零) 创建一个person类,属性(姓名,性别,年龄),方法sayhi() 。创建 一个employee类继承person类,特有属性salary,重写sayhi方法 。 新建控制台应用程序。 再次强调代码规范 规则(法律,必须遵守否则报错) 语法 规范(道德,大家都喜欢有道德的人。) 注释 骆驼命名 第一个单词首字母小写,之后的单词首字母大 写 username、userpassword、realname(普通变量、 字段) 帕斯卡命名 第一个单词首字母大写,之后的单词首字母 大写 getmax()、changename()(方法名、类名) 定义的变量或者方法 名字要有意义。 方法名:动词。(方法都是要做一件事情) 变量名:按功能命名、按方法的返回值内容命名( username=getusername();) 复习winform 桌面程序,桌面应用程序是相对于web应用程序而言的。 winform的控件 textbox、timer、checkbox、treeview、groupbox、label、button 、radiobutton、checkboxlist、radiobuttonlist、form、picturebox 、combobox、panel、。 winform程序是事件驱动的 案例:制作一个简易计算器,默认为“请选择” 结构体(*) 结构体是一个值类型。(非常像类的一种值类型,不具有面向对象的特征,通 常用来封装小型相关变量组 ) system.drawing.point、size、color 注意: 结构使用时可以new,也可以不new。如果不new,则使用前必须为结构成 员赋值。 在结构中不能为变量直接赋初值,除非const、static 结构可以实现接口,但不能继承。 结构的使用方法与类很相似。什么时候使用类?什么时候使用结构? 1.是否需要使用面向对象的特性:封装、继承、多态。,如果需要在某些情 况下被继承或者使用多态等特性则只能用类。 当类型中(类或结构)的成员比较多的时候,则考虑使用类。 结构与类的详细区别见备注。使用结构时注意装箱、拆箱的性能差异。 面向对象 什么是面向对象?一种分析问题的方式。 面向对象三大特性:封装、继承、多态。 什么是类?什么是对象?类和对象的区别?如何写一个汽车类? 类是模具,创建对象的模具,抽象的。 类是一种数据类型,用户自定义的数据类型 类组成:字段、属性、方法、构造函数等 对象是具体的,是类的具体实例。对象具有属性(特征)和方法(行 为) 案例:创建学生类,老师类,通过构造函数初始化类内部字段 this 当前对象 使用面向对象方式重做计算器v2.0。(写一个calculator类,里面有 几个计算方法。)实现winform版本与控制台版本。 练习:猜拳游戏。先分析类和对象。实现winform版本与控制台版本 。 添加引用与导入命名空间的区别 添加引用(前提) 添加程序集 导入命名空间 namespace (ctrl+ . 或shift + alt + f10) 为什么在另一个项目中建的类,添加引用后还是不能使用? (类的访问修饰符默认:internal,改成public) “参数”与“返回值” 参数的个数、类型与返回值没有任何半毛钱关系。 控制台应用程序中不要新建form 再次说明this的使用,通过this访问类的属性。this.fist 变量作用域 变量作用域:离声明该变量最近的那对包含声明语句的大括 号内部。 成员变量直接属于某个类,作用域在该类内部。 成员变量使用前如果不赋值,默认会有一个初始值。stringnull; int0;boolfalse 局部变量声明该变量的块语句或方法结束的封闭括号之前 的作用域内(使用之前必须得赋值。) 封装 提问:大家觉得什么是封装? 遥控器刚出来时候很神奇,点个按钮就能换电视台、切 音量、关电视。而我们使用遥控器的人不需要知道他是 怎么实现的(你只需要知道每个按钮的功能即可) 和遥控器类似,面向对象的封装就是把事物的状态和行 为封装在类中,使用类的人不需要知道类内部是怎么实 现的,只要调用其中的属性和方法实现功能就行。就像 你使用遥控,不需要知道他是怎么控制电视的,只要知 道按钮能换台就行 类和对象本身就是封装的体现。 1.属性封装了字段、2.方法的多个参数封装成了一个对象 、3.将一堆代码封装到了一个方法中、4.将一些功能封装 到了几个类中、5.将一些具有相同功能的代码封装到了 一个程序集中(dll、exe),并且对外提供统一的访问接 口。(属性名、方法名等。) 继承(是指类与类之间的关系。 ) 车 (vehicle) 卡车(truck) 轻型卡车 重型卡车 轿车 (car) -小轿车 面包车 如何判断一个继承关系是否合理?子类 is a 父类。 卡车和轿车都是车,都有轮子、发动机。但是卡车又能拉货,轿车能拉人 base class基类、parent class父类 derived class派生类、child class子类 为什么要继承?继承带给我们的好处? 代码重用 lsp里氏替换原则、多态。(程序的可扩展性、灵活性)方法重写 override。虚方法的原理:虚方法表。 子类继承父类的属性和方法,使创建子类变得很简单,实现了代码重用、以及多态 。 类的单根继承性、传递性、继承时构造函数的问题。 所有的类都直接或间接的继承自object。查看il代码。 关于继承的那些事儿 案例:定义学生类(姓名、性别、年龄、成绩,hello方法)、老师类(姓名、性 别、年龄、工资、hello方法)从中抽象出一个父类,通过构造函数给子类字段 赋值 protected 只能在子类内部和当前类内部中使用 可以在类内部以及所有子类中(内部)访问。 this: 1.作为当前类的对象,可以调用类中的成员。this.成员(调用成员, 自己) 2.调用本类的其他构造函数。:this()(调用构造函数,自己) base: 1.调用父类中的成员(调用成员,父类)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当前类中可以访问 protected 当前类及子类中可以访问 *internal当前程序集可以访问 protected internal 当前程序集或子类中(不同程序集也可以 访问)。 public 任何地方 访问级别约束 访问级别约束 1.子类的访问级别不能比父类的高。(会暴露父类 的成员) 2.类中属性或字段的访问级别不能比所对应的类型 访问级别高。 3.方法的访问级别不能比方法的参数和返回值的访 问级别高。 1.用于解决“可访问性不一致”的错误。 实现多态的手段1-虚方法virtual personchineseamericankorean,每个国家的人都有 一个说出自己国籍的方法。当有一个person的时候,循环 现实每个国家的人。 虚方法可以给父类中的方法一个实现,比如tostring()方法 虚方法必须有实现部分,哪怕是空实现。 案例:员工类、部门经理类(部门经理也是员工,所以要继 承自员工类。员工有上班打卡的方法。用类来模拟。 练习:把person类中的sayhello改为虚方法让其默认为学生 的,增加老师、司机类。 虚方法和抽象方法的区别。 见备注 静态成员-通过类名访问、实例成员-通过 对象访问 普通类中的静态成员static 只能通过类名访问 静态方法中只能访问静态成员,或通过对象访问实例成员。 多个对象共享同一个静态成员。 静态类 math、console、convert 等都是静态类。 静态类中只能包括静态成员 静态构造函数不能有参数、不能有访问修饰符(默认为private)。 静态成员属于类所有,非静态成员属于类的实例所有 c#静态方法属于类所有,类实例化前即可使用 在实例方法中可以直接调用静态方法,在静态方法中不可以直接调用 实例方法 静态方法和静态变量创建后始终使用同一块内存(静态存储区),而使 用实例的方式会创建多个内存 少使用静态类,静态类、静态成员所分配的内存在程序退出时才会释 放。 什么时候使用静态成员、静态类 1.在实例类中使用静态成员。 账户类:(实例类) class account username /用户名 address /地址 total /存款额 static rate /利率,由于该银行采用浮动利率,每天的利率根据当天的挂牌利 率(基准利率)来计算,所以“利率”不适合作为每个对象单独的一个数据。 /当多个对象共享同一个数据的时候就可以在实例类中加入静态成员。 2.使用静态类 在项目中需要频繁用到的一些工具类,例如:math、console、 convert 等。或者模拟“全局变量”的时候。 静态类的继承问题(*) 静态类不能被其他类继承 静态类只能继承自object类。(静态类不能继承自其它类。 ) 继承(多态)、静态本身就是相反的。 静态类不能实现任何接口, (因为接口中的成员都是实例成 员。*) sealed:(*)密封类,不能被继承。 sealed关键字,表示类不能被继承。(密封类) 密封类表示不能被继承。string类。 静态类的本质abstract+sealed(*,知道即可)static 静态类不能被实例化:abstract 静态类不能被继承:sealed 多态:为了程序的可扩展性。 开放封闭原则(对修改封闭,对扩展开放。) 先看看tostring()方法。普通类的tostring()、int32 多态就是指不同对象收到相同消息时,会产生不同行为,同一个类在 不同的场合下表现出不同的行为特征 多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类 对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的 不断变化。 里氏替换原则 父类引用指向子类对象person p=new chinese(); 父类对象不能够替换子类chinese c=new person();() is-a:可以用来验证继承关系中是否合理。(can do,验证实现接口是 否合理*) if(obj is 类型a)/obj是父类类型对象,”类型a”是子类类型。 关键字as (类型转换)、 is 实现多态的方式 lvirtual,子类重写父类中的方法。 labstract,子类重写父类中的方法。 l接口,实现接口的类,将接口中的方法实现。 怎么实现多态1-抽象类abstract 抽象类不能被实例化。抽象类中可以有普通成员。 抽象类存在的意义:1.抽象类不能被实例化,只能被其他类继承2.继 承抽象类的子类必须把抽象类中的所有抽象成员都重写(实现)(除 非子类也是抽象类。)3.抽象类就是为了重写多态。 什么是抽象类(光说不做) 不能被实例化的类(不能new) 抽象类的特点 见备注 案例:学生类和老师类中抽象出父类(person),并让学生和老师都要 具有sayhello和起立standup两个方法 练习1:动物animal 都有吃eat和叫bark的方法,狗dog和猫cat叫的 方法不一样.父类中没有默认的实现所哟考虑用抽象方法。 练习2:计算形状shape(圆circle,矩形square ,正方形rectangle) 的面积、周长 知识点补充1:关于抽象类知识 点补充 抽象类中的抽象成员不能使用private访问修饰符,可以使用 其他访问修饰符。 常见问题: 当鼠标放到父类上时,没有自动提示“必须实现父类中的抽 象方法”,原因可能是父类不是abstract或,父类中没有 abstract成员。 抽象类练习 1. 要实现u盘、mp3播放器、移动硬盘三种移动存储设备, 要求计算机能同这三种设备进行数据交换,并且以后可能会 有新的第三方的移动存储设备,所以计算机必须有扩展性, 能与目前未知而以后可能会出现的存储设备进行数据交换。 各个存储设备间读、写的实现方法不同,u盘和移动硬盘只 有这两个方法,mp3player还有一个playmusic方法 2. 橡皮鸭子(rubberduck)、真实的鸭子(realduck)。两个鸭 子都会游泳,而橡皮鸭子和真实的鸭子都会叫,只是叫声不 一样,橡皮鸭子“唧唧”叫,真实地鸭子“嘎嘎”叫 new(*) 隐藏、截断(用的不多, 了解) 方法的隐藏 swim方法是子类特有 class rubberduck:duck /方法的隐藏 /子类特有的方法,只不过方法名和父类重名了 public new void swim() console.writeline(“swim 被改变了“); 如果一个方法在子类中被重写 duck duck = new rubberduck() ; duck.bark() 调用子类的方法,因为 被重写了 抽象方法子类必须重写所以不能用new. 面向对象计算器 使用面向对象的方式实现+、-、* 、/的计算器 1、找对象 2、抽象出父类,让子类都有计算能力 3、实现子类 4、产生子类对象的工厂 5、调用 设计模式(gof23种设计模式) 世上本没路,走的人多了也就成了路 设计本没模式,程序写多了也就有了模式 总结前人的思想,总结出的解决某一类问题的通用方法 刚才的计算器就是设计模式中简单工厂设计模式 各种设计模式的本质都是:多态。充分理解了多态,再看设 计模式就会觉得轻松很多。 怎么实现多态2-接口 什么是接口? 接口就是一种规范,协议(*),约定好遵守某种规范就可以写通用的 代码。 定义了一组具有各种功能的方法。(只是一种能力,没有具体实 现,像抽象方法一样,“光说不做”) 接口存在的意义:多态。 接口解决了类的多继承的问题 接口解决了类继承以后体积庞大的问题。 接口之间可以实现多继承 案例(继承了一个类,同时实现了其他接口) 鸟-麻雀sparrowspru ,鸵鸟ostrichstrit ,企鹅penguinpengwin ,鹦鹉parrotprt 鸟能飞,鸵鸟,企鹅不能。你怎么办 子类继承抽象类,实现接口 接口中的成员必须不能有实现,接口不能实例化。 接口中的成员不能有访问修饰符,隐式公开public 接口中可以有属性、方法、索引器等,但不能有字段 接口中的所有成员必须被子类中全部实现 练习:从学生,老师,校长类中抽象出人的类,学生和老师 都有收作业的方法,但是校长不会收作业 再看一个接口案例 回顾:接口是一种规范。 什么是规范?理解规范的意义。 在程序中为什么需要规范?(多态,可以让我们编写 通用的代码,提高程序的可扩展性) 接口就像“法律”。 登记方法 dengji(person person) /人口登记,person是抽象类 dengji(car car) /汽车也要登记 dengji(house house) /房子也要登记。 ijikou dengji(ijiekou jk); 练习 橡皮rubber鸭子、木wood鸭子、真实的鸭子duck。三个鸭子 都会游泳,而橡皮鸭子和真实的鸭子都会叫,只是叫声不一 样,橡皮鸭子“唧唧”叫,真实地鸭子“嘎嘎”叫,木鸭子不会叫. 把抽象类变成接口。 显示实现接口(*) 为什么要显示实现接口? 方法重名后的解决办法。 显示实现接口后,只能通过接口来调用。不能通过类对象本 身来调用(显示实现的接口,查看il是private的,防止通过 类来调用) 为什么要有“显示实现接口”? 可以解决重名方法的问题。 什么是“显示实现接口”? 实现接口中的方法时用:接口名.方法名(),并且没有访问修饰符 “显示实现接口”后怎么调用? 只能通过接口变量来调用,因为显示实现接口默认为private。 接口的特点总结 l接口是一种规范。为了多态。 l接口不能被实例化。 l接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,不能修改。( 默认为public) l接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。 l接口中只能有方法、属性、索引器、事件,不能有“字段”。 l接口与接口之间可以继承,并且可以多继承。 l实现接口的子类必须实现该接口的全部成员。 l一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类a,并实 现了接口ia,那么语法上a必须写在ia的前面。class myclass:a,ia,因为类是单继 承的。 l当一个抽象类实现接口的时候,如果不想把接口中的成员实现,可以把该成员实现 为abstract。 l“显示实现接口”,只能通过接口变量来调用(因为显示实现接口后成员为private)。 使用接口的建议 面向抽象编程,使用抽象(父类、抽象类、接口)不使用具体。 “向上转型” 在编程时: 接口抽象类父类具体类(在定义方法参数、返回值 、声明变量的时候能用抽象就不要用具体。) 能使用接口就不用抽象类,能使用抽象类就不用类,能用 父类就不用子类。 避免定义“体积庞大的接口”、“多功能接口”,会造成“接口 污染”。只把相关联的一组成员定义到一个接口中(尽量在 接口中少定义成员)。单一职责原则 定义多个职责单一的接口(小接口)(组合使用)。(印 刷术与活字印刷术) 随着学习的深入再继续体会接口的作用。 抽象类复习、简单工厂设计模式复习 (*) 抽象类: 不能被实例化,需要被继承。多态。 子类必须重写父类中的所有的抽象成员,除非:子类 也是一个抽象类。 抽象成员在父类中不能有任何实现。 抽象类中可以有实例成员。 抽象成员的访问修饰符不能是private 抽象成员只能写在抽象类中。 abstract 作业:通过案例笔记本电脑的选择。 笔记本电脑父类、不同品牌的笔记本产品。 接口复习(*) 定义接口的语法(interface) 接口中只能包含方法、属性、索引器、事件。不能包含字段。见 备注1(貌似事件像一个字段?其实是两个方法。reflector查看源 码)。 接口中的成员不能有任何的实现(真正的“光说不做”。思考这样做 的意义。联想抽象类中的抽象方法。) 接口中的成员不能写访问修饰符。 使用接口的语法 一个类可以实现多个接口。 实现接口的类,必须把接口中的所有成员都实现。 子类实现接口中的成员时,不能修改成员的访问修饰符、参数列 表、方法名等。(与方法重写一样) 面试题 1. 如何使用virtual和override? person per = new student(); per.sayhi()调用的子类重写的sayhi方法 2. 如何使用abstract和override? 3. “方法重载overload” 、 “方法重写override“、 “隐藏new“是 同一个概念吗? 4.抽象类和接口的区别?见备注1. 抽象类适用于同一系列,并且有需要继承的成员。 接口适用于不同系列的类具有相同的动作。 对于不是相同的系列,但具有相同的行为,这个就考虑使用接口。 类型转换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 类型。 只有在内存存储上存在交集的类型之间才能进行隐式转换。 不能用cast转换string/int,只能用convert。 convert.toint32/convert.tostring 补充: 将任意类型转换成字符串: 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()转换失败不报异常。 再说as与直接类型转换: if(p is student) student stu=(student)p; clr会进行两次类型检查if(检查一次) /再检查一次 通过gettype(),gettype()不允许重写。 student stu=p as student; /推荐,效率高于第一种 类型转换convert convert考虑数据意义的转换。 convert是一个加工、改造的 过程。 若要进行其它类型的转换可以使用convert.toint32、 convert.tostring等。convert可以把object类型转换为其它 类型 string str= 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.操作文件时文件没了、权 限不足等;3.计算器用户输入的被除数是0;4.使用对象时对象为null ;等等。) .net为我们把“发现错误(try)”的代码与“处理错误(catch)”的代码分离开 来。 异常处理的一般代码模式: try catch finally try块:可能出问题的代码。当遇到异常时,后续代码不执行。 catch块:对异常的处理。记录日志(log4net),继续向上抛出等操作。 (只有发生了异常,才会执行。) finally块:代码清理、资源释放等。无论是否发生异常都会执行。 案例: int x = 5;int y = 0;int z = x / y; 程序运行运行时出错,后续的内容无法运行 程序一旦有一个功能发生异常,整个程序崩溃其它功能也无法正常运行 异常处理2 异常处理代码的其他几种形式: try 多个catch 一个finally try(1个或多个catch),多个catch的顺序问题。没有finally。 tryfinally(只能有一个),没有catch也可以。 注意点: 发生异常后,try块中,异常代码后的代码不会执行。 finally块中的代码,无论是否发生异常都会执行。 finally中不能写return语句。 try中有return语句,finally也会执行 即便没有catch,finally中的代码也会执行,但finally之后的代码则不会。 exception ex 异常也是对象,封装了异常发生时的一些信息。 exception 类主要属性:message、stacktrace、innerexception(*) 扔出自己的异常,扔:throw,抓住:catch 建议:通过逻辑判断(if-else)减少异常发生的可能性! 在多级方法嵌套调用的时候,如果发生了异常,则会终止所有相关方法的调用,并 且释放相关的资源。 值类型 引用类型 值类型均隐式派生自system.valuetype 数值类型、bool、结构、枚举 查看il,隐式继承自valuetype 引用类型派生自system.object 字符串、数组、类、接口等 查看il隐式继承自object 引用类型变量的赋值只复制对对象的引用。 值类型变量赋值会拷贝一个副本。 值类型、引用类型作为参数传递 值传递,刚才讨论的参数传递方式都是值传递。 引用传递,ref,传递的是变量的地址。 值传递(普通的参数传递) 引用传递(ref)(*) 值类型、引用类型 值传递、引用传递 值传递: 引用类型、值类型 引用传递(ref): 引用类型、值类型。 函数返回值(函数参数前的修饰符 ) params 可变参数 必须出现在参数列表的最后。 ref 仅仅是一个地址,引用传递,可以把值传递强制改为引用 传递 out 让函数可以输出多个值 1.在方法中必须为out参数赋值 2.out参数的变量在传递之前不需要赋值,即使赋值了也不能在方法中 使用。(赋值没意义) ref 参数在传递之前必须赋值 在方法中可以不为ref参数赋值,可以直接使用。 ref应用场景内部对外部的值进行改变,out则是内部为外部变 量赋值,out一般用在函数有多个返回值的场所。 ref与out案例 案例1:两个int变量的交换,用方法做。ref ? out 案例2:模拟登陆,返回登陆是否成功(bool),如果登陆失败, 提示用户是用户名错误还是密码错误”admin”,“888888” ref ? out 常用类库 学习.net就是学习它的无数个类库怎么用,先看两个简单的 string 字符串,不可变特性。字符串可以看成字符数组 属性 length 方法 isnullorempty() 静态方法,判断为null或者为” tochararray() 将string转换为char tolower()小写,必须接收返回值。(因为:字符串的不可变); toupper() 大写。 equals()忽略大小写的比较,stringcoparation.。 indexof() 如果没有找到对应的数据,返回-1 lastindexof()如果没有找到对应的数据,返回-1 substring()/2个重载 split() join()静态方法 format()静态方法 replace() trim() 注意:对字符串的操作一定要用变量接受返回值。(字符串 是不能变的,每次都是构建一个新的字符串) 字符串的处理练习1 课上练习1:接收用户输入的字符串,将其中的字符以与 输入相反的顺序输出。“abc“cba“ 课上练习2:接收用户输入的一句英文,将其中的单词以 反序输出。 “i love you“i evol uoy“ 课上练习3:”2012年12月21日”从日期字符串中把年月日 分别取出来,打印到控制台 课上练习4:把csv文件中的联系人姓名和电话显示出来 。简单模拟csv文件,csv文件就是使用,分割数据的文本 姓名:张三 电话:150011 string lines = file.readalllines(“1.csv“,encoding.default); 字符串的处理练习2 练习5:123-456-789-123-2把类似的字符串中重复 符号去掉,既得到123-456-789-123-2. 练习6:从文件路径中提取出文件名(包含后缀) 。比如从 c:/a/b.txt中提取出b.txt这个文件名出来。以后还会学更简 单的方式:“正则表达式”,项目中我们用微软提供的: path.getfilename();(更简单。) 练习7:“port=21,type=ftp”,这个字符串 表示ip地址为的服务器的21端口提供的是 ftp服务,其中如果“,type=ftp”部分被省略,则默认为http 服务。请用程序解析此字符串,然后打印出“ip地址为* 的服务器的*端口提供的服务为*” line.contains 练习8:求员工工资文件中,员工的最高工资、最低工资 、平均工资 常用类库 stringbuilder高效的字符串操作 当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作。 string 对象是不可变的。 每次使用 system. string 类中的一个方法时 ,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配 新的空间。 在需要对字符串执行重复修改的情况下,与创建新的 string 对象相关的系统开销可能会非常大。 如果要修改字符串而不创 建新的对象,则可以使用 system.text. stringbuilder 类。 例如,当 在一个循环中将许多字符串连接在一起时,使用 stringbuilder 类可以 提升性能。 stringbuilder != string/将stringbuilder转换为string.用tostring(); stringbuilder仅仅是拼接字符串的工具,大多数情况下还需要把stringbuilder 转换为string. stringbuilder sb = new stringbuilder(); sb.append(); sb.tostring(); sb.insert(); sb.replace(); 案例:使用程序拼html中的table string大量拼接演示。 集合类(增、删、查、改、遍历 ) l集合常用操作 添加、遍历、移除 l命名空间system.collections arraylist 可变长度数组,使用类似于数组 属性 capacity count 方法 add() addrange() remove() removeat() clear() contains() toarray() hashtable 键值对的集合,类似于字典,hashtable在查找元素的时候,速度很快。 add(object key,object value); hash“key” hash“key”=“修改”; .containskey(“key”); remove(“key”); 遍历: hash.keys hash.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-100之间的数。 练习:有一个字符串是用空格分隔的一系列整数,写一个程 序把其中的整数做如下重新排列打印出来:奇数显示在左侧 、偶数显示在右侧。比如2 7 8 3 22 9 5 11显示成7 3 9 2 8 22。 注意事项:不要把random的实例化放到循环里面 可以使用两个集合来降低产生随机数的循环次数。 random在循环中会降低执行效率(每次new的时候的种子是一样的, 当前时间。)(*)。 泛型集合:使用泛型集合 l书橱 l命名空间system.collections.generic list类似于arraylist dictionary类似于hashtable 推荐使用泛型集合。 t,k,v就像一把锁,锁住集合只能存某种特定的类型,这里的 t,k,v也可以是其它字母 泛型集合可以进行foreach遍历,是因为实现了 ienumerable具有了getenumerator()方法 先看foreach的本质。(*) 泛型集合 案例:把分拣奇偶数的程序用泛型实现。list 练习1:将int数组中的奇数放到一个新的int数组中返回。 练习2:从一个整数的list中取出最大数(找最大值)。别用max方法。 案例:简繁体转换 。dictionary。 课下练习:英汉翻译。winform做。发英汉词典txt。 练习:火星文翻译器。发字库。(作业。) 练习:把123转换为:壹贰叁。dictionary 练习:计算字符串中每种字符出现的次数(面试题)。 “welcome to chinaworld”,不区分大小写,打印“w2”“e 2”“o 3” 提示:dictionary,char的很多静态方法。 案例:编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期 ,比如:二零一二年十二月月二十一日要转换为2012-12-21。(处理“十”的问 题:1.*月十日;2.*月十三日;3.*月二十三日;4.*月三十日;)4中情况对“十” 的不同翻译。110;21;3不翻译;40 测试数据:二零一二年十二月二十一日、二零零九年七月九日、二零 一零年十月二十四日、二零一零年十月二十日 补充: 比较泛型集合list与arraylist的性能。循环增加整数。(装箱、拆 箱 )见备注。 /1.装箱、拆箱必须是: 值类型引用类型 或 引用类型值类型。 /object,接口。值类型是可以实现接口。 /person p=new student();/这个叫隐式类型转换,不叫装箱 。 /student stu=(student)p;/这个叫显示类型转换,不叫拆箱。 /int类型为什么能装箱到object类型,但不能装箱到string类型 或person类型, /因为object类型时int类型的父类。 /2.拆箱时,必须用装箱时的类型来拆箱 /装箱时如果是int,拆箱必须用int,不能用double /3.方法重载时,如果具有该类型的重载,那么就不叫拆箱或 装箱。 /4.字符串连接 / string.concat(s1, s2, n3, d4);判断是否发生了装箱,及次数 。 foreach(*) 演示一下。不需要掌握。 演示通过ienumerator接口遍历序列。 getenumerator()方法。 神奇的dictionary 自己动手写dictionary 。dictionary性能测试。为什么速度 这么快? 查字典为什么能这么快?目录中记录了每个汉字的页码,查找的时候先看 汉字的页码,再翻到指定的页就可以非常快速的找到词条了。 dictionary中有一个存储键值对的区域,这个区域的每个存储单元有地址编 号,根据hashcode算法,计算key的值的键值对应该存储的地址,将键值对 放入指定的地址即可。查找的时候首先计算key的地址,就可以找到数据了 。根据key找房间号,而不是逐个房间找。(*) 为什么dictionary这么快:当把一个kvp,采用一个固定算法(散列算法) 根据key来计算这个kvp存放的地址。取的时候也是根据要找的key可以快 速算出kvp存放的地址。 equals方法 比较两个对象是否为同一个对象? 什么是同一个对象? 为什么字符串的equals和别的不一样? /string的equals方法判断的是字符串的内容 是否相同(重写了object中的equals方法。 ) /而object中的equals方法是判断对象 的地址是否相同 文件操作常用相关类 file /操作文件,静态类,对文件整体操作。拷贝、删除 、剪切等。 directory /操作目录(文件夹),静态类。 directoryinfo /文件夹的一个“类”,用来描述一个文 件夹对象 fileinfo/文件类,用来描述一个文件对象 path/对文件或目录的路径进行操作(很方便)【字符串】 stream/文件流,抽象类。 filestream/文件流,memorystream(内存流 ),networkstream(网络流) streamreader /快速读取文本文件 streamwriter/快速写入文本文件 path类(对字符串操作) 目录和文件操作的命名控件system.io string changeextension(string path, string extension) (*) 修改文件的后缀,“修改”支持字符串层面的,没有真的给文件改名 string s = path.changeextension(“c:tempf3.png“, “jpg“) string combine(string path1, string path2) 将两个路径合成一个路径,比用+好,可以方便解决不加斜线的问题,自动 处理路径分隔符的问题 string s = path.combine(“c:temp“,“a.jpg“) string getdirectoryname(string path) (*) 得到文件的路径名。path.getdirectoryname(“c:tempa.jpg“) string getextension(string path) 得到文件的扩展名 string getfilename(string path) 得到文件路径的文件名部分 string getfilenamewithoutextension(string path) 得到去除扩展名的文件名 string getfullpath(string path) 得到文件的全路径。可以根据相对路径获得绝对路径 。 string gettempfilename() 得到一个唯一的临时文件名(*) string gettemppath() 得到临时文件夹的路径(*) 操作目录 资料管理器 为了实现目录树,所以要掌握读取目录的类 directory和directoryinfo void delete(string path, bool recursive) 删除目录, recursive 表示是否递归删除,如果recursive为false则只能删除空目录 bool exists(string path) 判断目录是否存在 move() create() string getdirectories(string path) 得到一个目录下的子目录 string getdirectories(string path, string searchpattern, searchoption searchoption) 通配符查找目录下的子目录,可 以搜索到隐藏文件。 static string getfiles(string path) 得到一个目录下的文件 string getfiles(string path, string searchpattern, searchoption searchoption) 通配符查找目录下的文件 directoryinfo getparent(string path) 得到目录的父目录 知识补充1(*) path.combine(path1,path2),见msdn 如果指定的路径之一是零长度字符串,则该方法返回其他路径。如果 path2 包含绝对路径,则该方法返回 path2。 如果path1不是以分隔符结束,并且不是c:或d:等(驱动器引用),则 在串联前为path1增加分隔符。 分隔符:(与操作系统平台有关) path.directorysep
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第三套大众健美操组合一动作 教学设计-2023-2024学年高三上学期体育与健康人教版必修第一册
- 广东电工考试题目及答案
- 古代科举考试题及答案
- 基于人工智能的数据分析对教师发展决策的支持
- 高庄电工考试题及答案
- 高考试题及答案册子
- 强化企业文化建设与员工激励机制的创新路径
- 2025试论合同义务转移的条款
- 放化疗医生考试题及答案
- 边缘区村落产业结构调整与可持续发展路径分析
- 4-04-05-04 国家职业标准数据库运行管理员S (2025年版)
- 民兵学习护路知识课件
- 危重患者皮肤管理课件
- 2025年国防教育知识竞赛试题(附答案)
- 工伤受伤经过简述如何写
- 银行现金取款申请书
- 人事外包招聘代理合同
- 数字经济学-课件 第3章 数字技术
- AI引领时尚设计新潮-个性化需求的新一代解决方案
- 高二数学直线倾斜角与斜率同步练习题
- 2024-2030年全球及中国热障涂层(TBC)行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
评论
0/150
提交评论