其实也不是特定冲着C#3.0去的,而是.net3.0,但关于C#3.0的新特性同一篇文章被转载的铺天盖地,就被岔开了,没看到.net3.0的什么特点,倒是被C#3.0吸引住了,这些新特性怎么越来越像javascript了?
(1)用var声明变量
js里是用var声明变量,但两者不同的是,js里的变量没有类型,数据才有类型,可以将一个变量指向任意的数据类型而运行自如。
而C#3.0里在用var声明变量时必须对其进行初始化,这样编译器能够根据初始化的值知道该变量的类型,将部分程序员要写的代码交给编译器去完成。就是说每个变量的类型还是固定的。
例如在C#3.0里可以这样直接声明并初始化变量:
的确省写了很多代码,呵呵。但是,如果你想把变量声明和初始化分开,那var关键字就无能为力了。
(2)直接构建对象
js里创建对象的快捷途径一直令我很happy,例如:
现在C#3.0竟也有类似的语法了:
其实也是由编译器做了更多的工作,在背后自己定义了一个类,更多的原理解释大家自己google吧。
(3)扩展方法
js里给一个类扩展方法也就是给prototype原型对象添加一个方法,非常方便。
现在C#3.0也提供了类似的功能,虽然偶觉得这个新特性可能太灵活了以至影响C#的严谨性甚至软件架构方面的问题,但是无疑这还是很吸引人的:
在任意一个类中定义上述静态方法,那么你的string对象就有直接的ToInt32方法了,是不是很方便?
(4)创建对象时同时进行初始化
同样是提供了一种简洁的语法来初始化一个对象,例如:
可以这样实例化:
这样可以少些多少构造函数啊,呵呵
(5)方便声明集合对象
以前对于数组可以直接声明时初始化:
而对于ArrayList这样的集合类型却没有简洁的语法,只能通过Add之类的方法逐一添加,
而在C#3.0中,所有实现ICollection接口的类都有了简洁的初始化语法:
(6)Lambda表达式
尽管委托作为C#最新引入的一个概念非常优秀,它也是事件机制的基础。但用起来却很麻烦,相信每个写过的人都有体会,现在C#3.0通过Lambda表达式简化了这个过程。
Lambda表达式的关键特征是将表达式或者语句块作为参数,通过=>来直接定义一个委托,这个委托的类型会根据一系列的转换规则,由编译器决定,例如:
这里的()表示一个空参数的函数,后面的Console.WriteLine("Hiya!!");是函数体。这样就很方便的实现了委托的定义,大家不妨回忆一下在C#1.1和C#2.0中是如何的麻烦,呵呵。
Lambda表达式不是那么容易理解,更多信息可以参见C#3.0的语言规范:
http://news.csdn.net/news/newstopic/26/26742.shtml
(7)查询表达式
虽然我对Ruby了解不多,但总感觉针对集合的查询,直接在语言中体现,这种灵感来源于Ruby。
于是C#3.0又多了一项诱人的特性,可以通过类似Sql语句的方式来获得需要的数据,结果可能存储于一个集合对象中或其他。
同样,没有能力三言两语将其说清楚,参见规范: