自從看了ScottGu的幾篇文章後就有想讓C#3.0的一些新特性在我的部落格上也留下曆史地一頁。但是由於環境不允許好久都沒有用上.NET 3.0,今天終於忍不住地要動一動鍵盤滿足一下自己的慾望,因為我自己的電腦上安裝了.NET 3.0 Framework SDK。在這裡我總結一下前輩們的研究成果,也為進一步鞏固自己的知識以便今後的開發,同時也希望能夠給大家帶來一點回憶。
下面我們來看一看我們在指令碼中常用的變數的聲明的"var"關鍵字,美其名曰隱式聲明變數,所申明變數的類型由第一個對其賦值(初始化)所決定的。依我的個人觀點,這將降低代碼的可讀性,但是有人說這個關鍵字主要是針對LinQ而設計得,因為LinQ所涉及的類型可能相當的複雜或在申明變數時還不知道其類型。根據前人的經驗總結這個關鍵字只是為了忽悠我們,在編譯下還是強型別的,在IL中並沒有出現新的東西。值得注意的是用var聲明的變數一定要初始化,如果對於幾何類型的初始化時還必須指名其類型。下面我們來看看例子:1var num=0;//num int
2var nums=new []{1,2,3,4,5};//nums int[]
3var str='';//str string
4var list=new List<int>();//int 要指出
5foreach(var i in nums){
6 num+=i;
7}
還有一個很神奇得新東西名字叫:擴充方法。相信大家都已經聽說過或已經用過這個新特性,這個也是我所喜歡的新特性之一,我們可以將我們自己擴充的方法弄到如string類型中,而且在VS編寫代碼時能夠智能提示。在ScottGu的文章裡我們知道,對於擴充的方法必須在靜態類裡來擴充。例如我們要寫一個驗證一個字串長度的方法,我們可以這樣寫:
1namespace NExplus.CSharp3Feature
2{
3 public static class MethodExtend
4 {
5 public static bool OutLength(this string str){
6 if(str.Length>10)return true;
7 return false;
8 }
9 }
10}
如果你想調用這個函數可以在你所有調用的類中引入所在的命名空間(using NExplus.CSharp3Feature;)然後就可以在自己的方法中調用這個方法:string.OutLength(yourstring);是不是很神奇。大家都知道Object是所有類的始祖,如果擴充Object的方法會怎麼樣呢?在所有類中都能調用你所擴充的方法,在這裡就不在贅述,不信你可以試一下,呵呵。
接下來我們看看對象初始化等的簡化,大家就不要在抱怨寫實體類了,在.NET 3.0中簡化了不少,咱們一起看看吧。
public class Person{
public Name{get;set;}
public NickName{get;set;}
}
var person=new Person{Name="xiaobing",NickName="網魂小兵"};
var persons==new List<Person>{
new Person{Name="xiaobing",NickName="網魂小兵"},
new Person{Name="xiaobing1",NickName="網魂小兵1"}
};
是不是很Happy,以後寫代碼就可以不用那麼辛苦了,初始化也簡化了不少,不要在象2.0先new 一個然後在add。在我們享受這美好的特性時,更激動人心的當然是Lambda運算式了,不用急讓我給你慢慢道來。
關於Lambda運算式的文章網上流傳很多,一搜一大堆,主要他和LinQ有比較好的結合。在LinQ中經常都會用到這種運算式,其實Lambda運算式也就是代理的升級版,引用一下別人的例子我們來看一下在各個版本中使用代理的不同代碼:
假設你需要建立一個按鈕,當點擊它的時候更新ListBox裡的內容。在C#1.0和1.1裡,你要這樣做:
1public MyForm()
2{
3 listBox = new ListBox();
4 textBox = new TextBox();
5 addButton = new Button();
6 addButton.Click += new EventHandler(AddClick);
7}
8void AddClick(object sender, EventArgs e)
9{
10 listBox.Items.Add(textBox.Text);
11}
而在2.0中可以這樣,代碼如下:1public MyForm()
2{
3 listBox = new ListBox();
4 textBox = new TextBox();
5 addButton = new Button();
6 addButton.Click += delegate
7 {
8 listBox.Items.Add(textBox.Text);
9};
你如果沒有熟悉1.0和1.1中的代理,沒有學會使用2.0中的代理,沒關係在3.0的lambda運算式更簡化了代理,代碼如下:1public MyForm()
2{
3
4 addButton.Click=>listBox.Items.Add(textBox.Text);
5}
由於Lambda一兩句話一說不出它的精妙所在,在LinQ中會大量應用到這個運算式,大家以後慢慢體會吧!到目前為止我想最值得期待的肯定是LinQ了,他也是.NET 3.0中的一個新東東,它將關係型查詢語句引入物件導向的世界, 大大增強了文法安全性。而且也對那些SQL感冒的開發人員來說也是一次新的革命啊,我的一個同事就是這樣的想法:)關於LinQ這方面的文章也是很多,文法表達能力很強大,對where , select , group , orderby , into 的文法都有支援,而且我也沒有很好的學習這個東東,只是大體上的瞭解,也沒有真正用過它,聽說有一個論壇要用這個來開發,不知道效果怎麼樣?這裡就對LinQ作個簡單的介紹。
以上是迄今為止所能夠瞭解到的新特性,不知道.NET 3.5是個什麼概念,微軟的步伐還真快,我追啊追啊還是追不上。聽說很多程式還在用1.1,現在還有很多公司在開發1.1的程式,不知道是怎麼個想法,不過我已經忘卻1.1,胸懷2.0,將要奔向3.0,未來的理想是3.5。本人水平有限,參考了一些資料,寫得不好請大家見諒,如果覺得我盜版可以給我留言:)