C#泛型学习笔记之一(约束)
2008-01-09 16:39
477 查看
泛型可以使代码重用率提高 泛型需要编译器解决类型安全并降低装箱拆箱引发的性能损耗 泛型给编译器带来的问题:约束 约束分为: 1.一般约束 T Find(K key) { Node current = m_Head; while(current.NextNode != null) { if(current.Key == key) //编译将不能通过 break; else current = current.NextNode; } return current.Item; } 以上编译错误是因为编译器无法保证Key类中包含==操作而引发 若要避免可将代码加上约束where 关键字,此关键字等于告诉编译器K实现了Icomparable的接口,附带的好处是将会在此类中为K类型的变量提供智能提示。 public class LinkedList where K : IComparable { T Find(K key) { Node current = m_Head; while(current.NextNode != null) { if(current.Key.CompareTo(key) == 0) break; else current = current.NextNode; } return current.Item; } //Rest of the implementation } 可以为某个类提供多个约束 public class LinkedList where K : IComparable where T : ICloneable {...} 2.派生约束 可以为某个子类K提供派生约束如下 public class MyBaseClass {...} public class LinkedList where K : MyBaseClass {...} 同样加上where关键字等同于告诉编译器K继承自MyBaseClass类,可以在LinkedList中为K提供智能提示 注意: 在此类约束中必须注意子类以及基类的访问控制 public class MyBaseClass {} internal class MySubClass where T : MyBaseClass {} 是没有问题的。但是,如果这两个类的可见性被颠倒,例如: internal class MyBaseClass {} public class MySubClass where T : MyBaseClass {} 则编译器会发出错误,因为程序集外部的任何客户端都无法使用一般类型 MySubClass,从而使得 MySubClass 实际上成为内部类型而不是公共类型。外部客户端无法使用 MySubClass 的原因是,要声明 MySubClass 类型的变量,它们需要使用派生自内部类型 MyBaseClass 的类型。 3.构造函数约束 class Node where T : new() { public K Key; public T Item; public Node NextNode; public Node() { Key = default(K); Item = new T(); NextNode = null; } } 加上new()关键字,等同于告诉编译器T类型一定包含有无参数的(默认的)构造函数。 可以将构造函数约束与派生约束组合起来,前提是构造函数约束出现在约束列表中的最后: public class LinkedList where K : IComparable,new() {...} MSDN上泛型的介绍:http://msdn2.microsoft.com/zh-cn/library/ms379564(vs.80).aspx#EWAA 以及示例:下载GenericsInCSharp.msi 示例文件 |
相关文章推荐
- 第81讲:Scala中List的构造时的类型约束逆变、协变、下界详解学习笔记
- iOS: 学习笔记, 加入一个带界面约束的控制器
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- StoryBoards学习笔记-约束添加
- mysql学习笔记(二)SQL的约束
- Go语言学习笔记-编译时的pakcage文件目录约束
- xml学习笔记(2)DTD约束
- Oracle 学习笔记 10 -- 约束
- 【SQL Server学习笔记】14:查漏补缺1(三值谓词,范式,主键/唯一/外键/检查/默认约束)
- 无约束非线性优化经典算法学习笔记
- oracle9i学习笔记之九 约束
- 学习笔记-数据操控语言DML,表和约束
- 学习笔记——XML的DTD语义约束
- T-SQL数据库约束学习笔记
- MySQL学习笔记(四)修改数据表约束
- [pho学习笔记]对象的克隆、遍历、类型约束
- Oracle 学习笔记 10 -- 约束
- 【PMP】Head First PMP 学习笔记 第二章 组织、约束和项目
- 经典SQL学习笔记 (五)-创建表、约束、修改表
- 对xib构建的UITableViewCell的重用方法和代码添加约束的方法 学习笔记