2000年之夏,微软大当家——盖茨先生着手战略调整,微软大刀阔斧的进行了技术改革与创新,并由此为世界带来一个新的名词,这就是.NET。那么什么是.NET呢?在.NET这一概念诞生之初,这一概念连微软本身都充满了定位的错乱和迷茫,以至于一时之间处处皆为.NET,大有一统江湖之势。随着.NET平台的逐渐完善,概念和定位上的混乱已经日渐清晰,作为这场变革中的一项重要内容,一种全新的、能够适应.NET平台特性的高级语言C#也随之诞生。这一任务理所当然的落在了Anders Hejlsberg的身上,作为Delphi之父,大师级的Anders从1998年11月开始领导了他的小组为这个世界带来全新的语言宠儿,这就是:C#。
初出茅庐的C#,就像羞羞答答的小姑娘,步步留心、时时在意,学着他人的模样,生怕在前辈面前丢脸。当她以全新的姿态出现在万千程序开发者眼前时,其兼取百家之长、优雅简洁之态、摒弃复杂之弊的特性,立时令所有的观望折服。在迎来所有目光的关注的同时,迅速成为高级语言战场的骄子。
那么,C#诞生之初兼取百家之长,具体都有哪些优秀品质呢,总结起来主要体现在两个方面包括:
面向对象编程。C#实现对属性、事件、委托、方法、索引器、构造器的全面支持,为面向对象的封装、继承、多态和接口提供了语言级别的支持。以继承为例,c#支持单实现继承和多接口继承,摒弃了C++中多继承带来的复杂性。
跨平台运行时支持。CLR是.NET平台下应用程序的通用语言运行时,是C#程序赖以生存的跨平台环境,因此C#具有了.NET平台语言的所有优势,通用类型系统、自动内存管理、统一异常处理、完全的FCL访问权,都成为C#无与伦比的优势所在。
C# 2.0是一次完善和补充,也是一次变革与重生。在2.0中引入了诸多的语言特性,完善了1.0基础上的某些不足,例如匿名方法将代码放在委托而无需创建新的方法;可空类型实现了对值类型的null操作;而部分类将一个类分解到多个类文件中。这些补充和完善, 总结起来主要包括:
·匿名方法
·可空类型
·部分类
·迭代器
·泛型
其中,泛型支持是C# 2.0的重中之重,.NET框架从CLR级别实现了对泛型的支持,提供专门的IL指令支持泛型操作,同时配合C#语言机制构造一种全新的编程结构,实现了对类型抽象化的通用处理方式,这就是算法重用。
以最简单的交换数据为例,我们来了解泛型带来的好处:
以上两种算法分别实现了对整型、字符串型数据的交换,在泛型引入之前实现相同的交换算法需要分别为所有的类型构建相似的处理逻辑,这显然是一种代码上的浪费,而泛型特性彻底解决了这一问题:
对于不同的类型,在运行时以实际类型对T占位符进行替换,并转换为本地代码,彻底实现了灵活的类型抽象和算法重用。同时,除了代码级别的重用好处,泛型解决了类型转换、装箱与拆箱、类型安全等诸多问题,为程序设计带来巨大的变革。
C# 3.0是语言发展历史上的里程碑变革,就像凤凰涅槃一般为C#语言注入强大编程体验和活力,简洁、干净、富有意义,这些特性中主要包括:
·匿名类型
·自动属性
·对象初始化器
·集合初始化器
·隐式类型变量和隐式类型数组
·扩展方法
·查询表达式
除此之外,C# 3.0的最大亮点就是LINQ(Language Integrated Query,语言集成查询),在CLR中集成类似于SQL式的数据查询能力,一种前所未有的函数式编程体验在面向对象语言中得以大展拳脚,这不得不说是C#带来的超酷体验。
因为,本文并非一本讲述编程的教科书,所以我们无法在有限的篇幅来展现优雅的代码,只能取一瓢饮之,并通过简要的对比来领略3.0中的强大功能。以对象初始化器为例,在2.0时初始化对象成员,我们以这种方式实现:
在3.0中,实现对象初始化有了更好的解决方案,由对象初始化器来完成:
同样的方式可以用来实现集合的初始化和隐式类型的初始化等
接着,我们再来了解一下自动属性带来的语法魅力,在3.0之前进行属性封装的是一件麻烦的事情,例如:
而自动属性将这一切化简为无形,语法简单而功能依旧:
这些所有的新特性最终都为了一个共同的目标而铺垫,这就是C# 3.0中最重量级的新特性:LINQ。所以,本文也不能少了对LINQ的讨论,在代码级别实现类似于SQL式的查询语法,以类型安全的通用方式完成增、删、改、查等数据操作的基本方式。只要数据源基于IEnumerable<T>接口而实现,那么不管是关系型数据、内存中集合还是XML都可以作为LINQ查询对象进行数据处理,这为面向对象语言实现函数式的编程体验创造了条件,一种全新的编程风格为编程体验刮来一股旋风:
你看,这种体验果然非同凡响,优雅而简单没有辜负Anders对于代码美学的追求。而作为编程用户,我们同样体味了这种理念在功能和结构上的双重精彩。