分析 C# 2.0 新特性 -- 范型(Generics)
作者:梁振[MS-MVP]
 
范型是提高面向对象程序多态性设计衍生的。
1,C# 多态性设计回顾和展望
在引入范型这个概念之前,回顾一下1.0或1.1中关于的Object类型的定义:
Object类型是.NET Framework中System.Object的一个别名,可以分配任何类型给Object类型的变量。
通过object类型的引入,实现了.NET对于面向对象程序多态设计。
因为Object本身是一个引用类型,是存放在Heap(堆)上的。对于其他引用类型和Object转换很容易实现。
而值类型和Object类型转换需要引入两个用于object类型和值类型转换概念boxing和unboxing.
(1)boxing 装包
  将转换一个值类型到Object类型,
  例如:int i = 1;            //存储在栈上
        object o = (object) i;//存储在堆上
  上面的代码在IL中将会是box [mscorlib]System.Int32
 将Int32和1同时装入一个Object对象中,结构如下:
 object[{Int32}-{1}];//前者表示boxing类型,后者表示其值
(2)unboxing 拆包
 将一个已装包为Obect类型的值类型转换回值类型
 操作分为两部分组成:
 a,首先检查是否转换回的类型是装包的类型,如果不是抛出一个InvalidCastException运行时错误.
 b,复制Object类型中的值到目标值类型变量;
 例如:
   int i = 1;
      object o = (object) i; //boxing
      int j = (int)o         //unboxing
      //double d = (double)o ,出现运行时错误
 
通过上面的可以看到在.NET Framework 1.0 中使用object对象设计的多态性比C++的template(一种基于类似宏的编
译时替换)执行效率增加了大量的copy的开销。所以在.NET Framewrok 2.0中引入范型来提高高面向对象程序多态性
设计。

2,范型概念和特点:
范型的设计是为了解决上面提到过的Object的多态性设计中的两个问题:
(1),性能上面的,boxing和unboxing需要大量的复制开销;
(2),安全性上面的,在上面一个例子看到了如果unboxing类型不同会抛出一个InvalidCastException异常;
范型的设计格式是使用<和>封闭其中一个范型参数,例如:
public class Stack<T>;
范型的实例化格式是使用需要使用的类型替换<和>封闭其中一个范型参数,例如:
Stack<char> char_Stack = new Stack<char>();
多范型类定义格式,在<和>封闭多个范型参数,例如:
class Node<K,T>
对于C++程序员,看上面关于范型的格式很快联系到了ISO C++当中的Template;
的确两者语法上面非常相似,但是两者的多态性编译和实现有很大不同.
在C++的Template编译后,没有编译带有Template的代码.而是通过一种宏的方式进行的替换过程.
每次使用Template类型,编译器都会生成一个对应的类型代码.而不管是否个类型代码已经使用过了.
在C#2.0中范型是在中间语言(IL)和公共语言运行时(CLR)支持的.
对于值类型:会在JIT编译时候替换参数类型,如果存在以及编译特定类型的机器代码,将直接返回这段代码.
这样避免了在ISO C++中Template可能带来代码膨胀.
对于引用类型:会直接在JIT编译时候替换参数类型.
理解C# 2.0范型是在实现是基于CLR支持的很重要啊,因为.NET的本质是和语言无关的.任何语言最后都是编译为中
间语言,这样基于IL和CLR支持的范型可以运用到所有基于CLR实现的语言,例如:Visual Basic 2005等等.
3,范型和其他类型执行效率对比例子
下面分别是使用Int,Object和范型构造的3个栈的类
 /// <summary>
 /// Int类型实现的栈
 /// </summary>
 class IntStack
 {
  private int[] data;
  private int current;
  private int length;
  public IntStack(int Length)
  {
   length = Length;
   current = 0;
   data = new int[length];
  }
  public int Top()
  {
   return data[current - 1];
  }
  public void Push(int Data)
  {
   if (current < length)
   {
    data[current++] = Data;
   }
  }
  public void Pop()
  {
   if (current > 0)
   {
    current--;
   }
  }
 }
 /// <summary>
 /// 范型的栈
 /// </summary>
 /// <typeparam name="T">范型</typeparam>
 class TemplateStack<T>
 {
  private int length;
  private int current;
  private T[] data;
  public TemplateStack(int Length)
  {
   current = 0;
   length = Length;
   data = new T[length];
  }
  public T Top()
  {
   return data[current - 1];
  }
  public void Push(T Data)
  {
   if (current < length)
   {
    data[current++] = Data;
   }
  }
  public void Pop()
  {
   if (current > 0)
   {
    current--;
   }
  }
 }
 /// <summary>
 /// Object的栈
 /// </summary>
 class ObjectStack
 {
  private object[] data;
  private int current;
  private int length;
  public ObjectStack(int Length)
  {
   length = Length;
   current = 0;
   data = new object[length];
  }
  public object Top()
  {
   return data[current-1];
  }
  public void Push(object Data)
  {
   if (current < length)
   {
    data[current++] = Data;
   }
  }
  public void Pop()
  {
   if (current > 0)
   {
    current--;
   }
  }
 }
通过测试直接使用Int的栈和范型构造Int栈的开销接近.
而比较前面两个Object每增加一次unboxig开销是增加的2倍.

4,附录.NET 2.0 Framework 范型容器列表:
Comparer<T>      Comparer   比较
Dictionary<K,T>     HashTable  hash表
LinkedList<T>         LinkList   链表
List<T>               ArrayList  数组链表
Queue<T>              Queue    队列
SortedDictionary<K,T> SortedList 排序链表
Stack<T>              Stack    栈
ICollection<T>  ICollection    容器接口
IComparable<T>  System.IComparable比较接口
IDictionary<K,T>  IDictionary    字典接口
IEnumerable<T>  IEnumerable    枚举接口
IEnumerator<T>  IEnumerator    跌代接口
IList<T>  IList          链表接口
 
参考资料:
《Design and Implementation of Generics for the .NET Common Language Runtime》 
  ---Andrew Kennedy Don Syme (Microsoft Research, Cambridge, U.K.)
《An Introduction to C# Generics》
  ---Juval Lowy IDesign (MSDN Online)
《C# Programmer's Reference》
  ---MSDN Library  (MSDN Online)

分析 C# 2.0 新特性 -- 范型(Generics)相关推荐

  1. 分析 C# 2.0 新特性 -- 空类型(Nullable Types)

    分析 C# 2.0 新特性  -- 空类型(Nullable Types) 在讨论C# 2.0 空类型前,先回顾一下.NET 1.0和.NET 1.1对于类型有下面这样的定义: ".NET  ...

  2. 【收藏】C# 2.03.0新特性总结

    c#2.0新特性 范型 我们知道通用的数据结构可以采用object存储任何数据类型.使用object问题是: 显示的强制转带来的代码复杂性 换装箱拆箱的性能损失(为什么有性能损失?因为涉及动态内存分配 ...

  3. J2SE5.0新特性之范型编程

    J2SE5.0新特性之范型编程 晁岳攀 smallnest@163.com 本章主要参考sun公司文档. C++程序员对范型编程肯定不陌生,尤其在STL大行其道的时候,C#2.0也将实现范型编程的功能 ...

  4. [翻译] C# 8.0 新特性

    原文: Building C# 8.0 [译注:原文主标题如此,但内容大部分为新特性介绍,所以意译标题为 "C# 8.0 新特性"] C# 的下一个主要版本是 8.0.我们已经为它 ...

  5. C#6.0,C#7.0新特性

    C#6.0,C#7.0新特性 C#6.0新特性 Auto-Property enhancements(自动属性增强) Read-only auto-properties (真正的只读属性) Auto- ...

  6. WCF4.0新特性体验(6):路由服务Routing Service(下)

    紧接前文WCF4.0新特性体验(5):路由服务Routing Service(上).今天我们介绍WCF4.0消息路由的实现机制,然后会讲解路由服务的实现过程. [4]WCF与路由服务: 其实在介绍WC ...

  7. 微软热门知识点之------c#3.0新特性【转】

    C# 3.0 davies 发表于 2005-9-16 09:53 | 分类: Programming :: 刚DotNet版看到有人贴了C# 3.0 的介绍,大概翻了一下,有不少惊喜,C#中引入了很 ...

  8. python-3.8.0 新特性之赋值表达式

    [python-3.8.0 新特性之赋值表达式] 赋值表达式的语法是这样的" name := expression ",形式上看和赋值语句 " = " 差不多, ...

  9. C# 3.0 新特性

    http://developer.51cto.com/art/200908/148353.htm 在发布Visual Studio 2005和C#2.0之后,微软公司又马不停蹄的展示了人们所期望的C# ...

最新文章

  1. AI理论知识基础(24)-凸函数
  2. 【深度学习】重大里程碑!VOLO屠榜CV任务,无需额外数据,首个超越87%的模型...
  3. 测试集准确率不变_这个医疗AI准确率突破天际,招来了铺天盖地的质疑
  4. IDEA中svn无法提交的问题解决方案Waring:not all local changes may be shown due:ClassCastException
  5. bzoj 1797: [Ahoi2009]Mincut 最小割 (网络流)
  6. 掌握渗透测试,从Web漏洞靶场搭建开始
  7. CCF2015-12-2 消除类游戏
  8. linux里用户权限:~$,/$,~#,/#的区别与含义
  9. 【Hadoop】HDFS数据复制
  10. 如何修复最常见的 macOS 11 Big Sur 问题?
  11. 小程序模板消息报错41028。解决方法
  12. 工作上碰到的技术问题积累
  13. oc实时渲染的图如何导出_C4D的几大主流渲染器
  14. 阿法狗之后的围棋世界
  15. ActiveMQ详细入门教程系列(一)
  16. as3压缩解压缩的第三方包及实现DEMO
  17. 组件,控件,用户控件
  18. 信号完整性分析系列2——什么是信号完整性及何时遇到
  19. loj #6046. 「雅礼集训 2017 Day8」爷
  20. 8种常用排序算法稳定性分析

热门文章

  1. Centos7 CMake升级
  2. Nginx反向代理+Go服务实践
  3. 浅析分布式数据库中间件DDM
  4. sp_executesql介绍和使用
  5. 移动端点击屏幕按钮闪现的灰色底框
  6. iOS打包,证书配置等
  7. core文件与gdb调试
  8. pandas清华镜像_一款可以像操作Excel一样玩Pandas的可视化神器来了!
  9. Windows 目录结构,服务以及端口, DOS常用命令学习
  10. 使用require.context实现前端工程自动化