C#程序设计 第5章泛型
C# 程序设计 第5章 泛型
泛型 ★ 泛型引例 泛型方法 泛型类 泛型集合 2
2 泛型 泛型引例 泛型方法 ★ 泛型类 泛型集合
本章目标 ■ 理解泛型的基本概念及使用泛型的优点 ■掌握泛型方法的定义和使用 ■掌握泛型类的定义和使用 ■掌握常用的泛型集合的使用
3 本章目标 ▪ 理解泛型的基本概念及使用泛型的优点 ▪ 掌握泛型方法的定义和使用 ▪ 掌握泛型类的定义和使用 ▪ 掌握常用的泛型集合的使用
泛型 ★ 泛型方法 4
4 泛型 ★ 泛型方法
引例 间题 思考:编写交换两个int数的方法? 编写交换两个doub I e数的方法? static void Swap(ref int x,ref int y) static void Swap(ref double x,ref double y) { { int temp; double temp; temp =x; temp =x; x=y; x=y; y=temp; y=temp; 交换两个shor t数的方法? 带来的问题:代码膨胀 交换两个decimal数的方法?
5 引例 static void Swap(ref int x, ref int y) { int temp; temp = x; x = y; y = temp; } static void Swap(ref double x, ref double y) { double temp; temp = x; x = y; y = temp; } 思考:编写交换两个int数的方法? 编写交换两个double数的方法? 交换两个short数的方法? 交换两个decimal数的方法?. 带来的问题:代码膨胀
如果C#没有泛型 问题 思考:集合的使用 >ArrayList、Stack、Queue、HashTable >任何引用或值类型都将隐式地向上强制转换为06ject(解决了代码膨胀) >如果项是值类型,则添加时需要进行装箱操作,检索时需要进行拆箱操作 带来的问题:装箱、拆箱 学生对象集合 ArrayList list1 new ArrayList(); Teacherach new Teacher(); list1.Add(3); students.Add(stu1 ) 能否加入一个 list1.Add(105); students.Add(teach) Teacher>对象? foreach (int x in list1) foreach (Object stuo i students)】 Console.WriteLine(x); Student stu = Console.Write 兼容任何类型 6
6 如果C#没有泛型 ArrayList list1 = new ArrayList(); list1.Add(3); list1.Add(105); foreach (int x in list1) { Console.WriteLine(x); } Teacherteach = new Teacher(); students.Add(stu1 ); students.Add(teach); foreach (Object stuo in students) { Student stu = (Student)stuo; Console.WriteLine(stu.Name); } 思考:集合的使用 ➢ArrayList、Stack、Queue、HashTable ➢任何引用或值类型都将隐式地向上强制转换为 Object(解决了代码膨胀) ➢如果项是值类型,则添加时需要进行装箱操作,检索时需要进行拆箱操作 带来的问题:装箱、拆箱 兼容任何类型 能否加入一个 Teacher对象? 学生对象集合
类型安全2 对象存储不 类型转换 易控制 容易出错 遍历集合 Student集合 Teacherx对象 张三 赵老师 李四 王五 添加对象 x 班级共包括4个学员。 运行错误 确定
7 类型安全2 Student集合 张三 李四 王五 赵老师 添加对象 遍历集合 对象存储不 易控制 类型转换 容易出错 Teacher对象 运行错误
泛型的概念 通过泛型可以定义类型安全的数据结构,而无须使用实际 的数据类型 ■所谓泛型,即通过参数化类型来实现在同一份代码上操作 多种数据类型,泛型编程是一种编程范式,它利用“参数 化类型”将类型抽象化,从而实现更为灵活的复用。 ■泛型的三大优点: ■可重用性 ■类型安全 ■效率 8
8 泛型的概念 ▪ 通过泛型可以定义类型安全的数据结构,而无须使用实际 的数据类型 ▪ 所谓泛型,即通过参数化类型来实现在同一份代码上操作 多种数据类型,泛型编程是一种编程范式,它利用“参数 化类型”将类型抽象化,从而实现更为灵活的复用。 ▪ 泛型的三大优点: ◼ 可重用性 ◼ 类型安全 ◼ 效率
泛型的定义 ■ C#中,可以定义: ■泛型接口 ■泛型类 ■ 泛型方法 ■泛型事件 ■泛型委托 ■ 泛型定义是通过泛型参数()来进行定 义的 ■创建泛型类的实例时,则需要与泛型参数对 应的实际类型
9 泛型的定义 ▪ C#中,可以定义: ◼ 泛型接口 ◼ 泛型类 ◼ 泛型方法 ◼ 泛型事件 ◼ 泛型委托 ▪ 泛型定义是通过泛型参数()来进行定 义的 ▪ 创建泛型类的实例时,则需要与泛型参数对 应的实际类型
泛型方法 ■ 泛型方法是使用类型参数声明的方法。编译器能 够根据传入的方法实参推断类型形参 ■编译器只能根据实参推断泛型参数,此时可以省略指定 实际泛型参数 ■编译器不能根据返回值推断泛型参数 [访问修饰符]返回值方法名(参数列表) 可用于该方法的返回类型声明、 参数类型声明和方法代码中的局 部变量的类型声明。 10 演示案例:泛型方法
10 泛型方法 ▪ 泛型方法是使用类型参数声明的方法。编译器能 够根据传入的方法实参推断类型形参 ◼ 编译器只能根据实参推断泛型参数,此时可以省略指定 实际泛型参数 ◼ 编译器不能根据返回值推断泛型参数 演示案例:泛型方法 [访问修饰符] 返回值 方法名 (参数列表) 可用于该方法的返回类型声明、 参数类型声明和方法代码中的局 部变量的类型声明