C#讲义-12 泛型_第1页
C#讲义-12 泛型_第2页
C#讲义-12 泛型_第3页
C#讲义-12 泛型_第4页
C#讲义-12 泛型_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、112 泛型n概述 n泛型类型参数n类型参数的约束n泛型类n泛型接口n泛型方法n常见泛型类21. 概述n泛型类和泛型方法同时具备可重用性、类型安全和效率 n泛型通常用与集合以及作用于集合的方法一起使用 n面向 2.0 及其以上版的所有应用程序都使用新的泛型集合类,而不要使用旧的非泛型集合类 如ArrayListn当然,也可以创建自定义泛型类型和方法,以提供自己的通用解决方案,设计类型安全的高效模式 3n在公共语言运行库和 C# 语言的早期版本中,通用化是通过在类型与通用基类型 Object 之间进行强制转换来实现的 。ArrayList list1 = new ArrayList(); lis

2、t1.Add(3); list1.Add(105); ArrayList list2 = new ArrayList(); list2.Add(It is raining in Redmond.); list2.Add(It is snowing in the mountains.); 4n但这种方便是需要付出代价的: 添加到 ArrayList 中的任何引用或值类型都将隐式地向上强制转换为 Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。 强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常

3、明显。 注:装箱box操作是在值类型转换为引用类型时的操作。 5n另一个限制是缺少编译时类型检查;因为 ArrayList 会将所有项都强制转换为 Object,所以在编译时无法防止客户端代码执行类似如下的操作:ArrayList list = new ArrayList(); list.Add(3); list.Add(It is raining in Redmond.); int t = 0; foreach (int x in list) t += x; 6n因此,ArrayList 需要一个类型参数。这正是泛型所能提供的。 List list1 = new List(); list1.

4、Add(3); 72 类型参数 npublic class GenericList n在泛型类型或方法定义中,类型参数是客户端在实例化泛型类型的变量时指定的特定类型的占位符。n类型形参声明必须是标识符,不能是类型。 public class GenericList n类型参数命名准则 使用描述性名称命名泛型类型参数 使用 T 作为具有单个字母类型参数的类型参数名 将“T”作为描述性类型参数名的前缀。 83 类型参数的约束 n在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为

5、约束。n约束使用 where 关键字指定:public class GenericList where T: 9struct类型参数必须是值类型 class类型参数必须是引用类型 基类名 类型参数必须是指定的基类或派生自指定的基类 接口名称 类型参数必须是指定的接口或实现了指定的接口 n几种常见的类型约束 : public class A public void f(); public class Class1 where T: A T t1; void g() t1.f(); 10114 泛型类 n泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等。从集合中添加和移除项这样的操作都以大

6、体上相同的方式执行,与所存储数据的类型无关。 n一般情况下,创建泛型类的过程为:从一个现有的具体类开始,逐一将每个类型更改为类型参数,直至达到通用化和可用性的最佳平衡 n需要特别注意以下事项: 将哪些类型通用化为类型参数。 如果存在约束,应对类型参数应用什么约束 是否将泛型行为分解为基类和子类。 是否实现一个或多个泛型接口。12n常见的通用的泛型类:nSystem.Collections .Generic名称空间下: Stack Queue HashSet List Dictionary135. 泛型接口 n为泛型集合类定义接口通常很有用,可以避免进行类型转换。 非泛型接口的定义: publi

7、c interface IComparable/ 非泛型接口 int CompareTo(object obj); public class Person : IComparable double height; public int CompareTo(object obj) Person p = obj as Person; / 类型转换是很耗时的 if (this.height p.height ) return 1; else return -1; 14泛型接口的定义: public interface IComparable/ 泛型接口 int CompareTo(T other);

8、 public class Person : IComparable public double height; public int CompareTo(Person other) if (this.height other.height) / 没有转换,快速 return 1; else return -1; 156. 泛型方法 泛型类的成员可以是泛型的函数:泛型类的成员可以是泛型的函数:static void Swap(ref T lhs, ref T rhs) T temp; temp = lhs; lhs = rhs; rhs = temp; 不存在独立的泛型函数。 与C+ 不同7.

9、 常用泛型类nList 表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法。16成员成员意义意义复杂度复杂度add 尾部增加元素O(1)insert在某个位置插入元素O(n)contains 是否包含某元素O(n)clear移除所有元素O(n)Find寻找某条件的元素O(n)foreach遍历每个元素O(n)remove移除某元素O(n)RemoveAt移除制定索引的元素O(n)sort 排序nlogn返回指定索引的元素O(1)count元素个数O(1)17nHashset n提供高性能的集合运算。集合是一组不重复出现且无特定顺序的元素。1819成员成员意义意义复杂

10、度复杂度add 增加元素O(1)contains 是否包含某元素O(1)clear移除所有元素O(n)foreach遍历每个元素O(n)remove移除某元素O(1)RemoveWhere移除某种特征的元素O(n)count元素个数O(1)n很多集合无法排序。如果需要排序则可以如下处理: class Node public int i; public int j; public Node( int pi,int pj) i=pi;j=pj; HashSet hs = new HashSet(); Random r = new Random(); for (int i = 0; i 5; i+)

11、 int temp= r.Next(100); hs.Add(new Node(temp, temp*2); foreach (Node n in hs) MessageBox.Show(n.i.ToString(); IEnumerable ie = hs.OrderBy(n = n.i); foreach (Node n in ie) MessageBox.Show(n.i.ToString();20nhs.OrderBy(n = n.i);nOrderBy的参数是一个委托Func keySelector nlambda 表达式。表示一个匿名函数。n运算符 =,读为“goes to”。左边是输入参数(如果有),右边包含表达式或语句块。n可以将此表达式分配给委托类型delegate int del(int i);del myDelegate = x = x * x;int j = myDelegate(5); /j = 2521nDictionary泛型类提供了从一组键到一组值的映射。字典中的每个添加项都由一个值及其相关联的键组成。n同Hashset类似。但是明确制定键值。n使用KeyValuePair 类型来访问每个元素。n在f

温馨提示

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

评论

0/150

提交评论