—高级软件人才实作培训专家北京传智播客教育基础加强讲师:赵晓虎—高级软件人才实作培训专家课前准备给大家一个建议:有问题多问,同样的时间,问的多就学的多。本课程目的:让大家都具有最基本的编程水平,保证能正常进行后续的课程。基础不好的同学抓紧复习(一次很好的机会)基础好的同学(复习,看参考书籍,继续提升,有问题可以问)•《C#图解教程》、《C#入门经典》《CLRviaC#》•《CSharpLanguageSpecification.doc》【C:\ProgramFiles\MicrosoftVisualStudio10.0\VC#\Specifications\2052\CSharpLanguageSpecification.doc】在vs的安装目录下。•可以一章一章的看,也可以讲到哪里看到哪里。编程到底怎么学?那么多语言该学哪门?•老杨的一个经典比喻:选择一种语言→泡妞。•多做练习,就像游泳。•反复练习,就像打铁。反复捶打,去除杂质,保留精华。书要越看越薄。—高级软件人才实作培训专家复习交换两个变量的值。(如果会使用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不可理解)。3程序运行时通过JIT编译(JustInTime)即时编译,将程序集编译为cpu能理解的机器码,这时cpu才能执行。(这个编译过程会与当前机器有关(根据当前机器的内存、cpu等))。ngen.exe—高级软件人才实作培训专家面向对象什么是面向对象?一种分析问题的方式(增强了程序的可扩展性)。面向对象三大特性:封装、继承、多态。什么是类?什么是对象?类和对象的区别?如何写一个汽车类?•类是模具,创建对象的模具,抽象的。•类是一种数据类型,用户自定义的数据类型•类组成:字段、属性、方法、构造函数等•对象是具体的,是类的具体实例。对象具有属性(特征)和方法(行为)案例:创建学生类,老师类,通过构造函数初始化类内部字段this,当前对象案例:使用面向对象方式重做计算器v2.0。(写一个Calculator类,里面有几个计算方法。)实现WinForm版本与控制台版本。练习:猜拳游戏。先分析类和对象。实现WinForm版本与控制台版本。—高级软件人才实作培训专家添加引用与导入命名空间的区别添加引用(前提)•添加程序集导入命名空间•namespace(ctrl+.或shift+alt+F10)为什么在另一个项目中建的类,添加引用后还是不能使用?(类的访问修饰符默认:internal,改成public)“参数”与“返回值”•参数的个数、类型与返回值没有任何半毛钱关系。控制台应用程序中不要新建Form再次说明this的使用,通过this访问类的属性。this.Fist—高级软件人才实作培训专家变量作用域变量作用域:离声明该变量最近的那对包含声明语句的大括号内部。成员变量—直接属于某个类,作用域在该类内部。•成员变量使用前如果不赋值,默认会有一个初始值。string→null;int→0;bool→false局部变量—声明该变量的块语句或方法结束的封闭括号之前的作用域内(使用之前必须得赋值。)—高级软件人才实作培训专家关于构造函数补充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()(调用构造函数,自己)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.—高级软件人才实作培训专家关于继承中“私有成员”能否被继承的问题我观点:私有成员不能被子类继承。原因:1.虽然子类继承父类后,在创建子类对象的时候,父类中的那些私有成员,也被分配了内存(子类中也有)。2.但是,继承只是面向对象中的一个概念,目的是为了子类使用(多态、代码重用),私有成员即便继承了,子类中也不能访问,所以在面向对象中,继承了但不能访问,没有意义。—高级软件人才实作培训专家访问修饰符private当前类中可以访问,类中成员的默认访问修饰符。protected当前类及子类中可以访问(在继承中用。)*internal当前程序集内部可以访问protectedinternal当前程序集或子类中(不同程序集也可以访问)。public任何地方—高级软件人才实作培训专家访问级别约束访问级别约束1.子类的访问级别不能比父类的高。(会暴露父类的成员)2.类中属性或字段的访问级别不能比所对应的类型访问级别高。3.方法的访问级别不能比方法的参数和返回值的访问级别高。1.用于解决“可访问性不一致”的错误。—高级软件人才实作培训专家实现多态的手段1-虚方法virtualPerson→Chinese→American→Korean,每个国家的人都有一个说出自己国籍的方法。当有一个Person[]的时候,循环现实每个国家的人。虚方法可以给父类中的方法一个实现,比如ToString()方法虚方法必须有实现部分,哪怕是空实现。案例:员工类、部门经理类(部门经理也是员工,所以要继承自员工类。员工有上班打卡的方法。用类来模拟。练习:把Person类中的SayHello改为虚方法让其默认为学生的,增加老师、司机类。虚方法和抽象方法的区别。见备注—高级软件人才实作培训专家静态成员-通过类名访问、实例成员-通过对象访问先通过窗体之间共享值,以及工具类,说明为什么要用static普通类中的静态成员static•只能通过类名访问•静态方法中只能访问静态成员,或通过对象访问实例成员。•多个对象共享同一个静态成员。静态类(一般都用作工具类,里面都是一些工具函数)•Math、Console、Convert等都是静态类。•静态类中只能包括静态成员•静态构造函数不能有参数、不能有访问修饰符(默认为private)。静态构造函数在第一次使用该静态类的时候只执行一次。静态成员属于类所有,非静