




已阅读5页,还剩104页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C 面向对象语法 第一章数据类型变量和表达式第二章分支和循环第三章面向对象基础与语法第四章面向对象高级应用第五章事件与委托第六章字符串数组与集合第七章IO流与序列化第八章异步通信和线程 第一章数据类型变量和表达式 一 数据类型1 值类型引用类型2 类型转换3 拆箱与装箱二 变量1 变量和常量命名规则三 表达式1 常用的表达式及优先级2 条件与 或 非 逻辑与 或 异或 第一章数据类型变量和表达式 一 数据类型 值类型和引用类型 1 值类型主要由简单类型 枚举类型和结构类型这三类组成 i 值类型 简单类型有符号整数 sbyte1字节 8位 128 127 short2字节 16位 32768 32767 int4字节 32位 2147483648 2147483647 long8字节 64位 9223372036854775808 9223372036854775807 无符号整数 byte1字节 8位 0 255 ushort2字节 16位 0 65536 uint4字节 32位 0 4294967295 ulong8字节 64位 0 18446744073709551615 单精度浮点型 float4字节 32位 1 5 10 45到 3 4 1038 7位精度 双精度浮点型 Double8字节 64位 5 0 10 324 1 7 10308 15位精度 十进制类型 decimal16字节 128位 1 0 10 28 7 9 1028 29位精度 布尔类型 bool1字节 8位 true或false 字符类型 char2字节 中文 或1字节 字母 16位 在0 65535范围内以双字节编码的任意符号 第一章数据类型变量和表达式 ii 值类型 枚举类型枚举类型为一组在逻辑上密不可分的整数提供便于记忆的符号比如 声明一个代表季节的枚举类型的变量 enumSeason Spring Summer Autumn Winter SeasoncurrentSeason 枚举类型一般写在类外 隶属于某个程序集enumSeason Spring Summe Autumn Winter publicvirtualvoidsay Console WriteLine Season Spring Console WriteLine Season 2 输出 Spring Autumn 第一章数据类型变量和表达式 iii 值类型 结构类型把一系列相关的变量组织成单一实体的过程 在C 中称为生成结构的过程 这个单一实体的类型就叫做结构类型 每一个变量称为结构的成员 结构类型的变量采用struct来声明 枚举类型一般写在类外 隶属于某个程序集structPhoneBook publicstringname publicintphoneNumber publicstringaddress publicPhoneBook stringname intNum stringaddress this name name this phoneNumber Num this address address 限制 不能显式定义无参构造函数如果有 有参构造函数 则在构造函数内 必须对每个变量有显式的赋值过程两种调用方法调用 1 PhoneBookphonebook phonebook name 周硕 phonebook phoneNumber 16134 phonebook address 湖北随州 调用 2 PhoneBookphonebook newPhoneBook 周硕 123 湖北随州 第一章数据类型变量和表达式 2 引用类型在内存中不直接存储引用类型的数据 而是存储该数据的地址 引用类型包括 类 class 接口 interface 数组 array 字符串 string 委托 第一章数据类型变量和表达式 二 类型转换i 字符串与其它数据类型转换字符串 数据类型Convert ToXXX XXX 目标类型eg inti Convert ToInt32 1234 数据类型 Parse 方法eg int Parse 1234 其它数据类型 字符串 ToString 方法ii 显示和隐示类型转化显示 从大范围到小范围 有符号的范围更广inti int 3 14 强制将double类型转换为int类型 隐示 小范围到大范围doublei 3 自动将int类型转为double类型 第一章数据类型变量和表达式 二 类型转换iii 父类与子类之间的转换PublicclassAnimal PublicclassDog Animal 父类的范围更广 子类自动转换为父类 Animalanimal newDog 父类到子类则不能进行强制转换Animalanimal newAnimal Dogdog Dog animal 报错As把一种类型转换为指定的引用类型classAobjA newclassA classDobjD classD objA 相当于classAobjA newclassA classDobjD objAasclassD 以上两种区别在于 第一种转换失败出现异常 而第二种则返回null 第一章数据类型变量和表达式 二 类型转换iiii 枚举转换enumSeason Spring Summer Autumn Winter 枚举类型一般写在类外 隶属于某个程序集enumSeason Spring Summe Autumn Winter publicvirtualvoidsay Console WriteLine int Season Spring Console WriteLine Season 2 输出 0 Autumn int Season Spring将枚举类型转换int类型 Season 2将int整型转换为枚举类型隐式枚举转换 允许把十进制整数0转换成任何枚举类型 而其他的整数则不存在这种隐式转换 显式枚举转换包括以下内容 从sbyte byte short ushort int uint long ulong char float double或decimal转换为任何枚举类型从任何枚举类型转换为sbyte byte short ushort int uint long ulong char float double或decimal从任何枚举类型转换为任何其他枚举类型 第一章数据类型变量和表达式 三 拆箱与装箱装箱就是将值类型转换为引用类型Eg inti 2011 Objectobj i 拆箱就是将引用类型转换为值类型intj int obj 第一章数据类型变量和表达式 四 1 变量命名规则 1 由字母 数字 下划线组成2 不允许以数字开头3 不能使用C 中的关键字eg privatestringuserName 关于变量命名的一般建议 变量名应具有描述性质变量名最好以小写字母开头在包含多个单词的变量名中 从第二个单词开始 每个单词都采取首字母大写的形式 第一章数据类型变量和表达式 四 2 常量1 使用关键字 const 静态常量 声明方法 const数据类型常量表达式 eg privateconststringuserName zhoushuo 常量具有如下特征 1 常量必须在声明时初始化 指定了其值后 就不能再修改了 2 常量的值必须能在编译时用于计算 因此 不能用从一个变量中提取的值来初始化常量 如果需要这么做 应使用只读字段 3 常量总是静态的 但注意 不必 实际上 是不允许 在常量声明中包含修饰符static 所以访问常量时用 类名 常量名在程序中使用常量至少有3个好处 A 常量用易于理解的清楚的名称替代了含义不明确的数字或字符串 使程序更易于阅读 B 常量使程序更易于修改 例如 在C 程序中有一个SalesTax常量 该常量的值为6 如果以后销售税率发生变化 把新值赋给这个常量 就可以修改所有的税款计算结果 而不必查找整个程序 修改税率为0 06的每个项 C 常量更容易避免程序出现错误 如果要把另一个值赋给程序中的一个常量 而该常量已经有了一个值 编译器就会报告错误 第一章数据类型变量和表达式 四 2 常量2 使用关键字 readonly 动态常量 声明方法 readonly数据类型常量表达式 在用const来定义常量的时候 在类型上有很多限制 首先 此类型必须属于值类型 同时此类型的初始化不能通过new来完成 因此一些用struct定义的值类型常量也不能用const来定义 readonly所定义的常量除了在定义的时候可以设定常量值外 还可以在类的构造函数中进行设定 由于readonly所定义的常量相当于类的成员 因此使用const来定义常量所受到的类型限制 在使用readonly去定义的时候全部消失 即可以用readonly去定义任何类型的常量classProgram privateconststringuserName abc privatereadonlystringpassWord publicProgram passWord 1234 Const声明变量时必须初始化Readonly则可以在构造函数中初始化 第一章数据类型变量和表达式 变量的作用域变量的作用域是指变量在程序中能够被识别的范围 局部变量在C 中 在方法内部创建的变量只能在方法内部使用 所以这种变量对于方法而言是局部的 被称为 局部变量 LocalVariable 第一章数据类型变量和表达式 8 变量的作用域变量的作用域是指变量在程序中能够被识别的范围全局变量与局部变量相对的 还有一个概念 全局变量 GlobalVariable 由任何位于方法外的语句来声明和初始化 分配内存等资源 所有在物理上位于全局变量声明之后的程序代码都可以调用并使用它 第一章数据类型变量和表达式 五 表达式运算符分为三类 一元运算符 只使用一个操作数二元运算符 使用两个操作数三元运算符 使用三个操作数运算符从高到低的优先级顺序 第一章数据类型变量和表达式 五 表达式条件运算符对条件表达式b x y 先计算条件b 然后进行判断 如果b的值为true 计算x的值 运算结果为x的值 否则 计算y的值 运算结果为y的值 逻辑运算符和布尔型操作数一起组成了逻辑表达式 扩充 第二章分支和循环 分支结构 C 中控制分支结构的语句包括 if else 语句和switch语句 switch语句的格式 switch 控制表达式 case常量表达式1 语句组1 break case常量表达式2 语句组2 break case常量表达式 语句组n break default 语句组n 1 break switch 中的输入参数只能是 有或无符号 整型 sbyte short int long 或字符型 包括字符串 不能用实型 浮点型 数 第二章分支和循环 分支结构 publicstringDefaultValue ColumnSchemacol stringresult 0 switch col DataType caseSystem Data DbType Boolean result false break caseSystem Data DbType Byte caseSystem Data DbType Decimal caseSystem Data DbType Double caseSystem Data DbType Int16 caseSystem Data DbType Int32 caseSystem Data DbType Int64 caseSystem Data DbType Single caseSystem Data DbType UInt16 caseSystem Data DbType UInt32 caseSystem Data DbType UInt64 caseSystem Data DbType Currency result 0 break caseSystem Data DbType Date caseSystem Data DbType DateTime result DateTime Now break caseSystem Data DbType Guid result Guid Empty break caseSystem Data DbType String caseSystem Data DbType StringFixedLength result String Empty break returnresult 第二章分支和循环 循环语句while循环do while循环for循环foreach循环continue和break在循环中的应用 第二章分支和循环 循环语句do while循环的语法结构 do 需要循环执行的语句 while 条件 continue 继续 结束当前这次循环 进入下次循环break 煞车 中断 结束整个循环 第二章分支和循环 foreach循环 只关心集合中的个体 不关心数量foreach语句为数组或对象集合中的每个元素重复一个嵌入语句组 演示如何使用foreach语句输出数组的内容 staticvoidMain string arr newstring Jan Feb Mar foreach stringsinarr System Console WriteLine s 第二章分支和循环 冒泡排序 冒泡排序 相邻的两个数比较 找出最大的值 publicint BubleSort int arr for inti 0 iarr j inttemp arr j arr j arr j 1 arr j 1 temp returnarr 第二章分支和循环 选择排序 选择排序 用一个数分别与所有的数比较 找出最小的值 publicint SelectSort int arr for inti 0 iarr j inttemp arr i arr i arr j arr j temp returnarr 第三章面向对象基础与语法 一 类class成员包含 字段Filed属性Property索引器Indexer方法Function事件Event 二 抽象类abstract创建抽象方法的语法是以访问修饰符开始 后面跟着abstract修饰符方法类型 方法名以及方法参数 三 接口Interface接口中方法无方法体接口是引用类型 是一系列需要实现的功能的定义 接口成员包括 方法属性索引器事件 第三章面向对象基础与语法 面向对象程序设计中的关键字 可访问性修饰符staticconstreadonlythis 第三章面向对象基础与语法 可访问性修饰符 public 对任何类和成员都公开 无限制访问 protected 仅仅对该类以及该类的派生类公开 private 仅仅对该类公开 internal 只能值包含该类的程序集中访问该类 protectedinternal 只能在本类 派生类或者包含该类的程序集中访问 namespace 默认是public 不允许定义public类默认是internal类成员默认是privatestruct 值类型 与继承无关 protected有关的对struct不适用Interface enum 默认是public对interface中的成员 可访问性无效 不需要定义 第三章面向对象基础与语法 static关键字静态的 不需要创建类的实例 就可以直接通过类名来访问static成员static方法static构造函数1 代码的执行顺序 代码在前的先执行 2 静态成员初始化语句要先于静态构造函数执行 3 静态成员初始化语句与静态构造函数只执行一次 第三章面向对象基础与语法 增加对Static构造函数的认识staticvoidMain string args Console WriteLine A X ToString Return 2Console WriteLine B Y ToString Return 1 输出 x为2 y为1classA publicstaticintX B Y staticA X classB publicstaticintY A X staticB Y 分析此类问题 只要记住三点就行了 1 代码的执行顺序 代码在前的先执行 2 静态成员初始化语句要先于静态构造函数执行 3 静态成员初始化语句与静态构造函数只执行一次 第三章面向对象基础与语法 const关键字 常量特点必须在定义的时候赋值一旦在写代码时赋过值 以后在运行时 不允许再修改隐含着是一个staticconst修饰值类型 OK 定义一个引用类型string 引用类型OK abc 其他引用类型 必须使用null赋初值可以修饰局部变量 局部变量 不能再修改值 稀有总结 在写代码时 就定义好的一个常量 值类型 编译的时候固定 第三章面向对象基础与语法 readonly关键字 运行时动态赋值 只读的一个常量特点可以是任何类型赋值在定义时就先赋值只能在构造函数中赋值不能修饰局部变量不带隐含的static不强制要求必须初始化总结 运行时只读 第三章面向对象基础与语法 this关键字代表当前这个实例使用只有2个领域在类内部访问自己类的成员 此时代表当前类的实例eg 在Car类中publicclassCar privatestringuserName this userName相当于Carcar newCar car userName 此处this代表当前类的实例 成员变量函数方法属性事件eg this xxx调用自己类的另一个构造函数 格式如下 eg this 参数列表 好处 只需要访问自己的成员时 使用this 过滤掉不相关的其他提示注意 不仅可以访问自己的成员 也可访问父类的成员 不建议使用this访问父类成员 应使用base 后续讲 this指向当前这个实例 所以只能访问实例的成员 不能访问静态成员 第三章面向对象基础与语法 一 类class 1 字段Filed 字段 是包含在类或结构中的对象或值 字段使类和结构可以封装数据 在类块中声明字段的方式如下 字段的访问级别字段的类型字段的名称eg publicstringuserName 同时声明字段和属性的简化方式 privatestringuserName publicstringUserName get returnuserName set userName value 相当于 简化方式 publicstringUserName get set 在编译过程中同样会生成上面字段和属性 第三章面向对象基础与语法 一 类class 2 属性property属性是这样的类成员 它们提供灵活的机制来读取 编写或计算私有字段的值 属性有 只读只有get只写只有set可读可写get set都有privatestringuserName publicstringUserName get returnuserName set userName value 其中value为C 中关键字 意义为引用用户提供的属性值 第三章面向对象基础与语法 一 类class 3 索引器Indexer1 索引器的定义C 中的类成员可以是任意类型 包括数组和集合 当一个类包含了数组和集合成员时 索引器将大大简化对数组或集合成员的存取操作 定义索引器的方式与定义属性有些类似 其一般形式如下 修饰符 数据类型this 索引类型index get 获得属性的代码 set 设置属性的代码 索引器类型表示该索引器使用哪一类型的索引来存取数组或集合元素 可以是整数 可以是字符串 this表示操作本对象的数组或集合成员 可以简单把它理解成索引器的名字 因此索引器不能具有用户定义的名称 可以通过索引器对数组赋值 第三章面向对象基础与语法 实例 为数组添加索引器classZ privatelong arr newlong 100 声明可容纳100个整数的整数数组publiclongthis intindex 声明索引器get if index 0 index 100 return0 检查索引范围else returnarr index set if index 0 index 0 arr index value 2 索引器的使用对象名 索引 其中索引的数据类型必须与索引器的索引类型相同 相同例如 Zz newz z 0 100 调用索引this intindex 传入参数0 并得到索引器返回结果z 1 101 Console WriteLine z 0 或console WriteLine arr 0 读取赋值后的结果表示先创建一个对象z 再通过索引来引用该对象中的数组元素 第三章面向对象基础与语法 3 索引器与属性的比较索引器与属性都是类的成员 语法上非常相似 索引器一般用在自定义的集合类中 通过使用索引器来操作集合对象就如同使用数组一样简单 而属性可用于任何自定义类 它增强了类的字段成员的灵活性 第三章面向对象基础与语法 实例 为集合添加int索引类型索引器publicclassCars publicIListList get set 定义集合list字段和属性简化式publicCarthis intindex 为list集合定义索引器Get returnList index publicclassCar privatestringbrand 定义相应的字段和属性publicstringBrand get returnbrand set brand value privatestringcolor publicstringcolor get retruncolor set color value 第三章面向对象基础与语法 调用索引器 publicstaticvoidMain string args Carscars newCars 创建一个cars对象实例 List newList 实例化cars中的List属性 并为其赋值newCar Brand 宝马 Color red newCar Brand 别克 Color 弦紫 Console WriteLine cars 0 Brand cars 0 Color 通过cars 0 调用Cars中的Carthis intindex 索引器 this为当前对象的实例 传入参数0 并获得返回结果Console WriteLine cars 1 Brand cars 1 Color Console ReadLine 输出结果 宝马red别克弦紫 第三章面向对象基础与语法 实例 为集合添加string索引类型索引器publicclassCars publicIListList get set 定义集合list字段和属性简化式publicCarthis stringindex 为list集合定义索引器Get for inti 0 i List Count i If index Equals List i Brand returnList i returnnull publicclassCar privatestringbrand 定义相应的字段和属性publicstringBrand get returnbrand set brand value privatestringcolor publicstringcolor get retruncolor set color value 第三章面向对象基础与语法 调用索引器 publicstaticvoidMain string args Carscars newCars 创建一个cars对象实例 List newList 实例化cars中的List属性 并为其赋值newCar Brand 宝马 Color red newCar Brand 别克 Color 弦紫 Console WriteLine cars 宝马 Brand cars 宝马 Color Console WriteLine cars 别克 Brand cars 别克 Color Console ReadLine 输出结果 宝马red别克弦紫 第三章面向对象基础与语法 方法Function1 方法的声明2 方法返回值3 方法参数4 构造函数5 静态构造函数Main方法变量作用范围方法重载 第三章面向对象基础与语法 1 方法的声明可访问性返回类型方法名 参数类型参数1 类型参数2 第三章面向对象基础与语法 2 方法的返回值如果想得到方法的返回信息 也就是说在声明方法的时候 返回值类型不为void 那么必须在方法内部编写一条返回语句 可以使用关键字return后面跟一个表达式 变量或者对象来完成返回语句的编写 第三章面向对象基础与语法 3 方法参数当引用类型作为参数传递给方法的时候 方法将会直接操作该引用所指向的那个数据 作为参数的数据会因为方法的内部操作产生变化 第三章面向对象基础与语法 方法参数续一publicvoidsetFiled Carcar car Brand zhoushuo car Color Red publicvoidsetValueFiled inti i 10 publicstaticvoidMain string args Programpg newProgram inti 0 Carcar newCar pg setFiled car pg setValueFiled i Console WriteLine Filed car Brand car Color Console WriteLine i 输出结果 zhoushuoRed0值类型参数针对变量副本的各种操作 引用类型的参数针对变量的各种操作 第三章面向对象基础与语法 方法参数续二params关键字 参数数组 何时使用 所需要使用的参数 数量不确定时注意 如果还有其他参数 记得一定要让 参数数组 是最后一个参数eg publicintExectueNoneQuery inti paramsSqlParameter param return1 调用 SqlParameterparam1 newSqlParameter param1 value1 SqlParameterparam2 newSqlParameter param2 value2 pg ExectueNoneQuery 10 param1 param2 或SqlParameter param newSqlParameter newSqlParameter param1 value1 newSqlParameter param2 value2 pg ExectueNoneQuery 10 param 第三章面向对象基础与语法 方法参数续三方法的参数包括 1 out关键字 输出参数注意 1 传参数到方法之前 可以不先赋值2 在方法内部 必须要有给参数赋值语句Eg publicvoidsetValueFiled outinti i 10 publicstaticvoidMain string args inti 0 pg setValueFiled outi Console writeline i 输出结果为10 一般用在某个方法需要返回多个值时 第三章面向对象基础与语法 方法参数续三2 ref关键字 按引用传值Reference 引用 强制要求参数按引用传值注意 1 传入参数之前 必须给参数赋值2 调用方法时 必须加ref关键字Eg publicvoidsetValueFiled refinti i 20 publicstaticvoidMain string args inti 10 pg setValueFiled refi Console writeline i 输出结果为20 相当于指针 第三章面向对象基础与语法 4 构造函数构造函数 对于要创建的实例进行初始化一些特殊的性质 构造函数的名字必须与类同名构造函数没有返回类型 它可以带参数 也可以不带参数声明类对象时 系统自动调用构造函数 构造函数不能其它方法中被显式调用构造函数可以重载 从而提供初始化类对象的不同方法若在声明时未定义构造函数 系统会自动生成默认的构造函数 此时构造函数的函数体为空 第三章面向对象基础与语法 调用当前类的构造函数 this关键字publicclassCar publicCar this jack jack this Brand 周硕 this Color Red Console WriteLine 无参构造函数 publicCar stringbrand stringcolor this Brand brand this Color color Console WriteLine 代餐构造函数 在构造函数后 this 参数列表 顺序先调用this 参数列表 构造函数 在调用 前的构造函数 第三章面向对象基础与语法 调用基类构造函数 base关键字PublicclassBaseCar publicBaseCar stringname stringcolor publicclassCar BaseCar publicCar base jack jack this Brand 周硕 this Color Red 在调用当前类的构造函数前 先调用父类的构造函数 第三章面向对象基础与语法 静态构造函数 用于对类本身进行初始化静态构造函数没有参数静态构造函数没有可访问性修饰静态构造函数由系统调用 不能显式调用静态构造函数最多只调用一次静态构造函数在第一次调用类的方法或成员 实例或静态 时 自动调用Eg staticCar 静态构造函数只调用一次且在第一次调用类的方法或成员时 自动调用 在类中 先加载成员变量 在调用构造函数 第三章面向对象基础与语法 二 抽象类abstract语法优点重写具有虚方法的抽象类抽象属性 第三章面向对象基础与语法 抽象类abstract1 抽象方法必须定义在抽象类中2 抽象类中可以出现方法的具体实现或virtual方法3 抽象类不能直接通过new实例化 必须通过继承自抽象类的子类来实例化注 含有抽象方法的类一定是抽象类 抽象类中不一定含有抽象方法创建抽象方法的语法是以访问修饰符开始 后面跟着abstract修饰符 方法类型 方法名以及方法参数 声明语句以分号而不是语句块结束 如下所示 access modifiers abstractreturn typemethod name parameters 第三章面向对象基础与语法 优点 抽象方法的优点在于基类无需对抽象方法提供实现 但是基类的派生类必须为基类中的抽象方法提供实现 重写 当派生类从抽象类中继承一个抽象方法时 派生类必须重写该抽象方法 这个规则在编译时强制实施 具有虚方法的抽象类 如果这个方法 子类可以重新实现 也可以不重新实现 使用父类的默认实现 定义方法为virtual虚方法定义 简单的说 虚方法就是可以被子类重写的方法 如果子类重写了虚方法 那么运行时将使用重写后的逻辑 如果没有重写 则使用父类中虚方法的逻辑 virtual关键字用于修饰方法 属性 索引器或事件声明 并且允许在派生类中重写这些对象抽象方法与虚方法的区别 派生类必须重写基类中的抽象方法 abstact 而基类的virtual虚方法则可以重写 也可以不重写 第三章面向对象基础与语法 关于抽象类的例子 publicabstractclassDALFactory publicabstractstringGetUserName get set 声明抽象属性publicabstractvoidSleep 声明抽象方法publicvirtualvoidEate 声明虚方法Console WriteLine DALFactoryvirtualMethod publicclassSqlDALFactory DALFactory publicoverridestringGetUserName get return 周硕 set userName value publicoverridevoidSleep Console WriteLine SleepDz publicoverridevoidEate Console WriteLine SqlDALFactoryvirtualMethod 第三章面向对象基础与语法 抽象方法和虚方法的区别在于 虚拟方法有一个实现部分 并为派生类提供了覆盖该方法的选项 相反 抽象方法没有提供实现部分 强制派生类覆盖方法 否则派生类不能成为具体类 abstract方法只能在抽象类中声明 虚方法则不是 abstract方法必须在派生类中重写 而virtual则不必 abstract方法不能声明方法实体 虚方法则可以 第三章面向对象基础与语法 接口是引用类型 是一系列需要实现的功能的定义 接口成员包括 方法属性索引器事件一个设计良好的接口可以包含一个紧密相关的功能集合 这些功能定义了一个特定行为 当一个对象实现了这个接口时 该对象就实现了这个行为 可以为接口开发新的增强实现 而不破坏现有的代码 因此接口的兼容性很强 也可以通过开发新的接口或接口的新实现来增强功能尽管可以修改接口的实现 但是接口本身在发布后就不能更改了 这一特性称为接口不变性 更改已发布的接口有可能破坏现有代码 若需要增强接口的功能 则必须创建新接口 第三章面向对象基础与语法 声明接口要使用interface关键字 语法如下 attributes access modifiers interfaceinterface name base list interface body Eg interfaceAnimal voidEateFood 实现接口 若要实现多接口继承 则需要列出这些接口 这些接口之间用逗号分开 如下所示 classChimpanzee Animal ICarnivore IHerbivore 第三章面向对象基础与语法 接口中声明方法属性的例子 publicinterfaceIBankAccount voidPayIn decimalamount boolWithdraw decimalamount decimalBalance get set 第三章面向对象基础与语法 接口与抽象类的比较 与抽象类不同的是 接口是一个完全抽象的成员集 这个成员集为相关操作定义了一组规则 接口的实现完全留给了开发者 抽象类为管理组件版本提供了一种简单易行的方法 通过更新基类 所有派生类都将自动进行相应更新 而接口在创建后就不能再更改 如果需要修改接口 则必须创建新接口 第三章面向对象基础与语法 接口与抽象类的比较 第四章面向对象高级应用 继承性1 方法重写 存在于继承关系中对抽象方法的重写对虚方法的重写2 除基类中的私有成员外 派生类可调用基类中的其他成员多态性1 方法重载 存在于一个类中 第四章面向对象高级应用 虚方法的定义要用到virtual关键字 如下所示 publicclassAnimal publicvirtualvoidEat Console WriteLine Eatsomething 这样 Animal类的任何派生类都可以实现新的Eat 方法 第四章面向对象高级应用 如果在派生类中要重写基类方法 那么需要使用override关键字 如下所示 publicclassCat Animal publicoverridevoidEat Console WriteLine Eatsmallanimals 第四章面向对象高级应用 方法重载 1 方法名相同 且必须在同一个类中2 方法参数个数或类型不同 与方法的返回类型无关例子 PublicclassAnimal PublicvoidEate Console writeLine Eate方法 PublicvoidEate stringeateMethod Console writeLine 重载Eate方法 第五章事件与委托 一 委托Delegatedelegate是C 中的一种类型 它实际上是一个能够持有对某个方法的引用的类 与其它的类不同 delegate类能够拥有一个签名 signature 并且它只能持有与它的签名相匹配的方法的引用 它所实现的功能与C C 中的函数指针十分相似 它允许你传递一个类A的方法m给另一个类B的对象 使得类B的对象能够调用这个方法m 但与函数指针相比 delegate有许多函数指针不具备的优点 首先 函数指针只能指向静态函数 而delegate既可以引用静态函数 又可以引用非静态成员函数 在引用非静态成员函数时 delegate不但保存了对此函数入口指针的引用 而且还保存了调用此函数的类实例的引用 其次 与函数指针相比 delegate是面向对象 类型安全 可靠的受控 managed 对象 也就是说 runtime能够保证delegate指向一个有效的方法 你无须担心delegate会指向无效地址或者越界地址 实现一个delegate是很简单的 通过以下3个步骤即可实现一个delegate 1 声明一个delegate对象 它应当与你想要传递的方法具有相同的参数和返回值类型 2 创建delegate对象 并将你想要传递的函数作为参数传入 3 在要实现异步调用的地方 通过上一步创建的对象来调用方法 第五章事件与委托 publicclassMyDelegateTest 步骤1 声明delegate对象publicdelegatevoidMyDelegate stringname 这是我们欲传递的方法 它与MyDelegate具有相同的参数和返回值类型publicstaticvoidMyDelegateFunc stringname Console WriteLine Hello name publicstaticvoidMain 步骤2 创建delegate对象 参数为欲传递的方法MyDelegatemd newMyDelegate MyDelegateTest MyDelegateFunc 步骤3 调用delegatemd sam1111 输出结果是 Hello sam1111 第五章事件与委托 二 事件C 中的事件处理实际上是一种具有特殊签名的delegate 象下面这个样子 publicdelegatevoidMyEventHandler objectsender MyEventArgse 其中的两个参数 sender代表事件发送者 e是事件参数类 MyEventArgs类用来包含与事件相关的数据 所有的事件参数类都必须从System EventArgs类派生 当然 如果你的事件不含参数 那么可以直接用System EventArgs类作为参数 结合delegate的实现 我们可以将自定义事件的实现归结为以下几步 1 定义delegate对象类型 它有两个参数 第一个参数是事件发送者对象 第二个参数是事件参数类对象 2 定义事件参数类 此类应当从System EventArgs类派生 如果事件不带参数 这一步可以省略 3 定义事件处理方法 它应当与delegate对象具有相同的参数和返回值类型 4 用event关键字定义事件对象 它同时也是一个delegate对象 5 用 操作符添加事件到事件队列中 操作符能够将事件从队列中删除 6 在需要触发事件的地方用调用delegate的方式写事件触发方法 一般来说 此方法应为protected访问限制 既不能以public方式调用 但可以被子类继承 名字是OnEventName 7 在适当的地方调用事件触发方法触发事件 publicclassEventTest 步骤1 定义delegate对象publicdelegatevoidMyEventHandler objectsender System EventArgse publicclassMyEventCls 步骤3 定义事件处理方法 它与delegate对象具有相同的参数和返回值类型publicvoidMyEventFunc objectsender System EventArgse Console WriteLine Myeventisok 步骤4 用event关键字定义事件对象privateeventMyEventHandlermyevent privateMyEventClsmyecls publicEventTest myecls newMyEventCls 步骤5 用 操作符将事件添加到队列中this myevent newMyEventHandler myecls MyEventFunc 步骤6 以调用delegate的方式写事件触发函数protectedvoidOnMyEvent System EventArgse if myevent null myevent this e publicvoidRaiseEvent EventArgse newEventArgs 步骤7 触发事件OnMyEvent e 第五章事件与委托 事件是类和对象向外界发出的消息 事件的执行是通过事件委托的方式 调用我们所准备好的处理方法 而是先消息的响应的 要响应某些事件并针对某些事件执行我们意定的方法 需要做到以下几步 1 声明事件委托 2 声明事件 3 添加事件的触发方法 4 添加事件的处理程序 响应事件的方法 5 将指定的事件处理程序邦定到要处理的事件上 订阅事件 6 用户信息操作 并触发事件 调用事件的触发方法 7 通过事件委托的回调 执行我们需要的事件处理程序 下面我们举一个简单的自定义事件处理程序的例子 控制台程序 Eg2 namespace事件 发布事件的类publicclassTestEventSource 定义事件参数类publicclassTestEventArgs EventArgs publicreadonlycharKeyToRaiseEvent publicTestEventArgs charkeyToRaiseEvent KeyToRaiseEvent keyToRaiseEvent 定义delegatepublicdelegatevoidTestEventHandler objectsender TestEventArgse 用event关键字声明事件对象publiceventTestEventHandlerTestEvent 事件触发方法protectedvirtualvoidOnTestEvent TestEventArgse if TestEvent null TestEvent this e 引发事件publicvoidRaiseEvent charkeyToRaiseEvent TestEventArgse newTestEventArgs keyToRaiseEvent OnTestEvent e 监听事件的类publicclassTestEventListener 定义处理事件的方法 他与声明事件的delegate具有相同的参数和返回值类型publicvoidKeyPressed objectsender TestEventSource Te
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论