[你必须知道的.NET] 第七回:品味类型---从通用类型系统开始
系列文章导航:
[你必须知道的.NET] 第四回:后来居上:class和struct
[你必须知道的.NET] 第五回:深入浅出关键字---把new说透
[你必须知道的.NET] 第六回:深入浅出关键字---base和this
[你必须知道的.NET] 第七回:品味类型---从通用类型系统开始
[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理
[你必须知道的.NET] 第九回:品味类型---值类型与引用类型(中)-规则无边
[你必须知道的.NET] 第十回:品味类型---值类型与引用类型(下)-应用征途
[你必须知道的.NET] 第十一回:参数之惑---传递的艺术(上)
[你必须知道的.NET] 第十二回:参数之惑---传递的艺术(下)
[你必须知道的.NET] 第十三回:从Hello, world开始认识IL
[你必须知道的.NET] 第十四回:认识IL代码---从开始到现在
[你必须知道的.NET] 第十六回:深入浅出关键字---using全接触
[你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考
[你必须知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
3. 位置与关系
位置强调的是CTS在.NET技术框架中的位置和作用,作者期望以这种方式来自然的引出.NET技术架构的其他基本内容,从而在各个技术要点的层次中,来讲明白各个技术要点的些细联系,从大局的角度来对其有个基本的把握。我想,这样也可以更好的理解CTS本身,因为技术从来都不是孤立存在的。
.NET技术可以以规范和实现两部分来划分,而我们经常强调和提起的.NET Framwork,主要包括公共语言运行时(Common Language Runtime, CLR)和.NET框架类库(Framework Class Library, FCL),其实是对.NET规范的实现。而另外一部分:规范,我们称之为公共语言架构(Common Language Infrastructure, CLI),主要包括通用类型系统(CTS),公共语言规范(Common Language Specification, CLS)和通用中间语言(Common Intermediate Language, CIL)。我们以图的形式来看看CTS在.NET技术阵营中的位置,再来简要的介绍新登场的各个明星。
• CLI,.NET技术规范,已经得到ECMA(欧洲计算机制造商协会)组织的批准实现了标注化。
• CTS,本文主题,此不冗述。
• CLS,定义了CTS的子集,开发基于CTS的编译器,则必须遵守CLS规则,由本文开头的图中就可以看出CLS是面向.NET的开发语言必须支持的最小集合。
• CIL,是一种基于堆栈的语言,是任何.NET语言编译产生的中间代码,我们可以理解为IL就是CLR的汇编语言。IL定义了一套与处理器无关的虚拟指令集,与CLR/CTS的规则进行映射,执行IL都会翻译为本地机器语言来执行。常见的指令有:add, box, call, newobj, unbox。另外,IL很类似于Java世界里的字节码(Bytecode),当然也完全不是一回事,最主要的区别是IL是即时编译(Just in time, JIT)方式,而Bytecode是解释性编译,显然效率上更胜一踌。
• CLR,.NET框架核心,也是本系列的核心。类似于Java世界的JVM,主要的功能是:管理代码执行,提供CTS和基础性服务。对CLR的探讨,将伴随着这个系列的成长来慢慢展开,在此就不多说了。
• FCL,提供了一整套的标准类型,以命名空间组织成树状形式,树的根是System。对程序设计人员来说,学习和熟悉FCL是突破设计水平的必经之路,因为其中数以万计的类帮助我们完成了程序设计绝大部分的基础性工作,重要的是我们要知道如何去使用。
可见,这些基本内容相互联系,以简单的笔墨来澄清其概念、联系和功能,显然还不够力度。然而在此我们以抛砖引玉的方式来引入对这些知识的探求,目的是给一个入口,从此来进行更深入的探索是每个设计人员的成长的关键,就像对FCL的认识,需要实践,需要时间,需要心思。
4. 通用规则
• .NET中,所有的类型都继承自System.Object类。
• 类型转换,通常有is和as两种方式,具体的探讨可以参考我的另一拙作《第一回:恩怨情仇:is和as》。另外,还有另外的几个类型转换的方式:(typename)valuename,是通用方法;Convert类提供了灵活的类型转换封装;Parse方法,适用于向数字类型的转换。
• 可以给类型创建别名,例如,using mynet = Anytao.net.MyClass,其好处是当需要有两个命名空间的同名类型时,可以清楚的做以区别,例如:
Code
using AClass = Anytao.net.MyClass;
using BClass = Anytao.com.MyClass;
其实,我们常用的int、char、string对应的是System.Int32、System.Char、System.String的别名。
• 一个对象获得类型的办法是:obj.GetType()。
• Typeof操作符,则常在反射时,获得自定义类型的Type对象,从而获取关于该类型的方法、属性等。
• 可以使用 CLSCompliantAttribute 将程序集、模块、类型和成员标记为符合 CLS 或不符合 CLS。
• IL中使用/checked+开关来进行基元类型的溢出检查,在C#中实现这一功能的是checked和unchecked操作符。
• 命名空间是从功能角度对类型的划分,是一组类型在逻辑上的集合。
5. 结论
类型的话题,是个老掉牙的囫囵觉,但也是个永不言退的革命党。在实际的程序设计中,我们经常要吃这一亏。因为,很多异常的产生,很多性能的损耗,很多冗余的设计都和类型解下不解之缘,所以清晰、清楚的了解类型,没有什么不可以。重要的是,我们以什么角度来了解和化解,内功的修炼还是要从内力开始。本系列不求包罗万象,但求以更新鲜、更全面的角度,清楚、干净、深入的把某个问题说透,此足尹。
品味类型,就从CTS开始了。
©2007 Anytao.com