浅析.NET泛型
泛型是.NET Framework 2.0最强大的功能,通过泛型可以定义类型安全的数据结构,而没有必要使用实际的数据类型,这将显著提高性能并得到更高质量的代码。在.NET Framework 2.0之前,没有泛型的时候,经常使用的是数组,但是这样的话避免不了的会产生拆箱和装箱的操作。
泛型在IL(中间语言)和CLR本身中都支持,在编译泛型C#代码时,首先编译器会将其编译为IL,就像其他任何类型一样。从.NET编译层面来讲,大体分为两次编译,一次是语言层面的编译,也就是把C#或VB语言编程成IL中间语言,第二次编译JIT(即时编译),这时候是把IL中间语言编程成机器码,具体的可以查看《CLR via C》和《程序员的自我修养--链接、装载与库》这两本书,对于泛型 IL只包含实际特定类型的参数或占位符,并有专用的IL指令支持泛型操作。真正的泛型实例化工作以“on-demand”的方式,发生在 JIT 编译时。当进行JIT 编译时,JIT 编译器用指定的类型实参来替换泛型 IL 代码元数据中的 T,进行泛型类型的实例化。这会向JIT编译器提供类型特定的IL元数据定义,就好像从未涉及到泛型一样。简单来讲就是在实例化类时,根据用户指定的数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际的数据类型,等同于用实际类型写的类。这点上要比Java的擦除法的伪泛型要强很多。再说下元数据,这个东西在在编译成IL中间语言时候它就有了,它是一个二进制数据块,由几个表组成,大致包含的信息就是源代码中的类型、字段、方法、属性和事件,其实在用visual studio开发的时候,可能很多人可能都没有留意,VS的智能提示其实都是靠编译后的元数据来提示的,包括反射都是用的元数据。
以上就是对.NET泛型的简单说明,如有什么问题,可以关注我的微信公众号反馈给我,我也会尽量的在那上面分享一些技术文章。以上详细知识可以参考《C#数据结构》《CLR via C》和《程序员的自我修养--链接、装载与库》这三本书。
浅析.NET泛型的更多相关文章
- 浅析Java 泛型
泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...
- 浅析Java泛型
什么是泛型? 泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体的类型.这种参数类型 ...
- Java基础之多态和泛型浅析
Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...
- scala的泛型浅析
1. scala泛型浅析 package com.dtspark.scala.basics /** * 1,scala的类和方法.函数都可以是泛型. * * 2,关于对类型边界的限定分为上边界和下边界 ...
- Java泛型学习笔记 - (七)浅析泛型中通配符的使用
一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ...
- lua迭代器和泛型for浅析
(一) 首要概念要理清: 1. 在lua中,函数是一种"第一类值",他们具有特定的词法域."第一类值"表示在lua中函数与其他传统类型的值(例如数字和字符串)具 ...
- 读书笔记 C# Type类型与泛型有关的某些属性浅析
IsGenericType 如果类型为泛型,则返回 true. GetGenericArguments 返回 Type 对象数组,这些对象表示为构造类型提供的类型变量,或泛型类型定义的类型参数.如果是 ...
- Java泛型学习笔记 - (六)泛型的继承
在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: Object obj = new Integer(10); 这其实就是面向对象编程中的is ...
- C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析
前景提要: 编写程序时,也许你不经意间,就不知不觉的使程序代码,发生了装箱和拆箱,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少装箱和拆 ...
随机推荐
- Windows Server 2008 R2 备份和恢复 (转)
Windows Server Backup : 1.安装Windows Server Backup的方法: 通过"服务器管理器"中的"添加功能"向导进行安装. ...
- Scala 具体的并行集合库【翻译】
原文地址 本文内容 并行数组(Parallel Array) 并行向量(Parallel Vector) 并行范围(Parallel Range) 并行哈希表(Parallel Hash Tables ...
- VS常用的配置和插件
- NSBundle 的理解和 mainBundle
http://www.360doc.com/content/15/0629/10/20918780_481405304.shtml
- eclipse android logcat 只显示自己应用程序信息的设置方法
1 elcipse 中往往会在logcat中显示 all message ,而这里面的信息太多,根本没有办法进行区分.如图: 2 我们想显示自己项目的 logcat .下面开始设置. 3 首先点击上面 ...
- 随机抽样一致性算法(RANSAC)示例及源代码
作者:王先荣 大约在两年前翻译了<随机抽样一致性算法RANSAC>,在文章的最后承诺写该算法的C#示例程序.可惜光阴似箭,转眼许久才写出来,实在抱歉.本文将使用随机抽样一致性算法来来检测直 ...
- OpenCV 2.4.8组件结构全解析
转自: http://blog.csdn.net/huang9012/article/details/21811271 之前啃了不少OpenCV的官方文档,发现如果了解了一些OpenCV整体的模块架构 ...
- android studio 中查找代码中的硬编码
在Android Studio中同时按下Ctrl + Shift+ F 或者其他自定义的快捷键,打开全局搜索,在全局搜索中输入 ^((?!(\*|//)).)+[\u4e00-\u9fa5] 并打勾 ...
- C#中yield return用法分析
这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下. 本文 ...
- 构建基于WinRT的WP8.1 App 03:Page控件
单页面模板 通常利用Visual Studio 2013创建的最简单的WP8.1应用是Blank App,它只包含一个不带任何UI的页面,并且没有任何状态管理的逻辑. 该不带任何UI的页面称为Blan ...