C#3.0新特性

术步伐实在太快,我怕我是跟不上了,出来很久才有空关注一下。
暂且记录下我对C#3.0的一知半解吧,或许底下可以直接去学C#4.0了,呵呵 C#3.0新特性

其实也不是特定冲着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  tbTitle = new  System . Web . UI . WebControls . TextBox ();

的确省写了很多代码,呵呵。但是,如果你想把变量声明和初始化分开,那var关键字就无能为力了。

(2)直接构建对象
js里创建对象的快捷途径一直令我很happy,例如:

var  book ={ title : 'bookTitle' ,  author : 'nate' ,  id : 222 };

现在C#3.0竟也有类似的语法了:

var  book = new  { title = "bookTitle" ,  author = "nate" ,  id = 222 };

其实也是由编译器做了更多的工作,在背后自己定义了一个类,更多的原理解释大家自己google吧。

(3)扩展方法
js里给一个类扩展方法也就是给prototype原型对象添加一个方法,非常方便。
现在C#3.0也提供了类似的功能,虽然偶觉得这个新特性可能太灵活了以至影响C#的严谨性甚至软件架构方面的问题,但是无疑这还是很吸引人的:

public  static  ToInt32 ( this  String  s ){
  return  Convert . ToInt32 ();
}

在任意一个类中定义上述静态方法,那么你的string对象就有直接的ToInt32方法了,是不是很方便?

(4)创建对象时同时进行初始化
同样是提供了一种简洁的语法来初始化一个对象,例如:

public  class  Point {
  public  int  x ;
  public  int  y ;
}

可以这样实例化:

var  point = new  Point { x = 100 , y = 200 };

这样可以少些多少构造函数啊,呵呵

(5)方便声明集合对象
以前对于数组可以直接声明时初始化:

string []  s = new  string []{ "red" , "blue" , "black" , "white" };

而对于ArrayList这样的集合类型却没有简洁的语法,只能通过Add之类的方法逐一添加,
而在C#3.0中,所有实现ICollection接口的类都有了简洁的初始化语法:

var  alColors = new  ArrayList { "red" , "blue" , "black" , "white" };

(6)Lambda表达式
尽管委托作为C#最新引入的一个概念非常优秀,它也是事件机制的基础。但用起来却很麻烦,相信每个写过的人都有体会,现在C#3.0通过Lambda表达式简化了这个过程。
Lambda表达式的关键特征是将表达式或者语句块作为参数,通过=>来直接定义一个委托,这个委托的类型会根据一系列的转换规则,由编译器决定,例如:

DemoDelegate  myDelegate  =  (  )  =>  Console . WriteLine (  "Hiya!!"  )  ;

这里的()表示一个空参数的函数,后面的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语句的方式来获得需要的数据,结果可能存储于一个集合对象中或其他。
同样,没有能力三言两语将其说清楚,参见规范:

你可能感兴趣的:(新特性)