关于CLS,CTS,CLI
本文将介绍以下内容:
1.引言 本文不是连环画,之所以在开篇以图形的形式来展示本文主题,其实就是想更加特别的强调这几个概念的重要性和关注度,同时希望从剖析其关系和联系的角度来讲述.NET Framework背后的故事。因为,在作者看来想要深入的了解.NET,必须首先从了解类型开始,因为CLR技术就是基于类型而展开的。而了解类型则有必要把焦点放在.NET类型体系的公共基础架构上,这就是:通用类型系统(Common Type System,CTS)。 我之所以将最基本的内容以独立的章节来大加笔墨,除了为后面几篇关于对类型这一话题深入讨论做以铺垫之外,更重要的是从论坛上、博客间,我发现有很多同行对.NET Framework基础架构的几个重要体系的理解有所偏差,因此很有必要补上这一课,必备我们在深入探索知识的过程中,能够游刃有余。 2. 基本概念 还是老套路,首先引入MSDN对通用类型系统的定义,通用类型系统定义了如何在运行库中声明、使用和管理类型,同时也是运行库支持跨语言集成的一个重要组成部分。通用类型系统执行以下功能:
那么我们如何来理解呢? 还是一个现实的场景来引入讨论吧。小王以前是个VB迷,写了一堆的VB.NET代码,现在他变心了,就投靠C#的阵营,因为流行嘛。所以当然就想在当前的基于C#开发的项目中,应用原来VB.NET现成的东西,省点事儿:-)。那么CLR是如何来实现类型的转换的,例如Dim i as Single变量i,编译器会自动的实现将i由Single到float的映射,当然其原因是所有的.NET编译器都是基于CLS实现的。具体的过程为:CTS定义了在MSIL中使用的预定义数据类型,.NET语言最终都要编译为IL代码,也就是所有的类型最终都要基于这些预定义的类型,例如应用ILDasm.exe分析可知,VB.NET中Single类型映射为IL类型就是float32,而C#中float类型也映射为float32,由此就可以建立起VB.NET和C#的类型关系,为互操作打下基础。
.method
public
hidebysig
static
void
Main(
string
[]args)cilmanaged
{ .entrypoint // 代码大小15(0xf) .maxstack 1 .localsinit(float32V_0) IL_0000:nop IL_0001:ldc.r4 1 . IL_0006:stloc. 0 IL_0007:ldloc. 0 IL_0008:call void [mscorlib]System.Console::WriteLine(float32) IL_000d:nop IL_000e:ret } // endofmethodBaseCts::Main 过去,由于各个语言在类型定义方面的不一致,造成跨语言编程实现的难度,基于这一问题,.NET中引入CTS来解决各个编程语言类型不一致的问题,类型机制使得多语言的代码可以无缝集成。因此CTS也成为.NET跨语言编程的基础规范,为多语言的互操作提供了便捷之道。可以简单的说,基于.NET的语言共同使用一个类型系统,这就是CTS。 进一步的探讨通用类型系统的内容,我们知道CTS支持两种基本的类型,每种类型又可以细分出其下级子类,可以以下图来表示: .NET提供了丰富的类型层次结构,从上图中也可以看出该层次结构是基于单继承层次实现的,反映了.NET面向对象原则中实现单继承、接口多继承的特点。关于值类型和引用类型,是之后要探讨的重点内容,也是『品味类型』子系列的重中之重,在此不作进一步探讨,但是上面的这张图有必要清楚的印在心中,因为没有什么比这个更基础的了。 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技术阵营中的位置,再来简要的介绍新登场的各个明星。
可见,这些基本内容相互联系,以简单的笔墨来澄清其概念、联系和功能,显然还不够力度。然而在此我们以抛砖引玉的方式来引入对这些知识的探求,目的是给一个入口,从此来进行更深入的探索是每个设计人员的成长的关键,就像对FCL的认识,需要实践,需要时间,需要心思。 4. 通用规则
using
AClass
=
Anytao.net.MyClass;
using BClass = Anytao.com.MyClass; 其实,我们常用的int、char、string对应的是System.Int32、System.Char、System.String的别名。
5. 结论 类型的话题,是个老掉牙的囫囵觉,但也是个永不言退的革命党。在实际的程序设计中,我们经常要吃这一亏。因为,很多异常的产生,很多性能的损耗,很多冗余的设计都和类型解下不解之缘,所以清晰、清楚的了解类型,没有什么不可以。重要的是,我们以什么角度来了解和化解,内功的修炼还是要从内力开始。本系列不求包罗万象,但求以更新鲜、更全面的角度,清楚、干净、深入的把某个问题说透,此足尹。 品味类型,就从CTS开始了。 一.参考文献 (USA)Jeffrey Richter,Applied Microsoft .NET Framework Programming (USA)David Chappell, Understanding .NET 二.牛人说话-.net CLI CLS CTS Q: How does the CLI compare to the CLS and the CTS?Anders Hejlsberg: CLS stands for Common Language Specification,CTS stands for Common Type System. The CLS is a specification of what features any programming language implemented on the .NET platform must support.Q: OK,the CLS is less than the CTS. Where does the CLI fit?Anders Hejlsberg: The CTS is basically another word for the type system in .NET,i.e. a specification of what a class,struct,enum,or such is. CLI is really just another word for the large subset of the .NET Framework that we submitted to ECMA.Peter Golde: The CLI includes the CLS and the CTS.Q: Anders,after your work on Turbo Pascal,Delphi,Visual J++ and now C#,how do you see programming languages evolving today?Anders Hejlsberg: Jeeez,had to ask an easy one,eh? I guess I'm becoming less and less of a believer in revolutionary approaches to language design. It really is amazing how much the capabilities of computing have evolved,yet we're basically still using the same kinds of programming languages. It gives me hope that we can go even further with an evolutionary approach where we don't just invalidate all the work that went before. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |