引言
語言是程序開發者行走江湖的手上利器,各大門派的高手在論壇、博客為了自家門派爭吵不已早是技術世界中的亮麗風景,雖多少為剛剛踏入江湖的新手提供了思考的素材,但也同時迷惑了初出茅廬的前行方向。
本文不欲計較門派的高下,旨在明辨技術的真谛,這就是.NET平台下的開發利器:C#語言,並從其變遷的進程中對於.NET技術發展把玩一番。
在上篇,我們走在歷史,對.NET的過去尤其是c#語言做以回顧,具體而言就是.NET 1.0、2.0、3.0的一路走來。
.NET之,歷史腳步
C#十年了。這個日期是從Anders Hejlsberg在1998年組建C#團隊開始算起的,掐指算來已是十年有余了。作為.NET平台下的靜態強類型語言,在過去10年的發展歷程中披荊斬棘,已經逐漸成為應用開發語言中的佼佼者。從TIOBE開發語言排行榜的最新統計來看,C#位居第六成為開發語言市場的頂級產品:
表 1 TIOBE開發語言排行榜
(注:此為2008年12月的TIOBE開發語言排行榜,參考http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html)
因此,在我們講解歷史的開始,將C#發展歷史中的裡程碑作以標記,來感受一下C# 10年的發展歷程,為每開發者在心底搭起一座通往未來的橋梁。
下面我們分別從不同的歷史階段來了解C#語言的變遷,並討論在每個變遷的裡程碑上值得品味的閃光點,並由此為未來的發展打一個基礎。
1.0,從誕生到立足
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#無與倫比的優勢所在。
2.0,變革之作
C# 2.0是一次完善和補充,也是一次變革與重生。在2.0中引入了諸多的語言特性,完善了1.0基礎上的某些不足,例如匿名方法將代碼放在委托而無需創建新的方法;可空類型實現了對值類型的null操作;而部分類將一個類分解到多個類文件中。這些補充和完善, 總結起來主要包括:
匿名方法
可空類型
部分類
迭代器
泛型
其中,泛型支持是C# 2.0的重中之重,.NET框架從CLR級別實現了對泛型的支持,提供專門的IL指令支持泛型操作,同時配合C#語言機制構造一種全新的編程結構,實現了對類型抽象化的通用處理方式,這就是算法重用。
以最簡單的交換數據為例,我們來了解泛型帶來的好處:
// Release : code01, 2009/05/07
// Author : Anytao, http://www.anytao.com
public static void Swap(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}
public static void Swap(ref string str1, ref string str2)
{
string temp = str1;
str1 = str2;
str2 = temp;
}
以上兩種算法分別實現了對整型、字符串型數據的交換,在泛型引入之前實現相同的交換算法需要分別為所有的類型構建相似的處理邏輯,這顯然是一種代碼上的浪費,而泛型特性徹底解決了這一問題:
// Release : code02, 2009/05/07
// Author : Anytao, http://www.anytao.com
public static void Swap<T>(ref T t1, ref T t2)
{
T temp = t1;
t1 = t2;
t2 = temp;
}
對於不同的類型,在運行時以實際類型對T占位符進行替換,並轉換為本地代碼,徹底實現了靈活的類型抽象和算法重用。同時,除了代碼級別的重用好處,泛型解決了類型轉換、裝箱與拆箱、類型安全等諸多問題,為程序設計帶來巨大的變革。
3.0,涅槃與重生
C# 3.0是語言發展歷史上的裡程碑變革,就像鳳凰涅槃一般為C#語言注入強大編程體驗和活力,簡潔、干淨、富有意義,這些特性中主要包括:
匿名類型
自動屬性
對象初始化器
集合初始化器
隱式類型變量和隱式類型數組
擴展方法
查詢表達式
除此之外,C# 3.0的最大亮點就是LINQ(Language Integrated Query,語言集成查詢),在CLR中集成類似於SQL式的數據查詢能力,一種前所未有的函數式編程體驗在面向對象語言中得以大展拳腳,這不得不說是C#帶來的超酷體驗。
因為,本文並非一本講述編程的教科書,所以我們無法在有限的篇幅來展現優雅的代碼,只能取一瓢飲之,並通過簡要的對比來領略3.0中的強大功能。以對象初始化器為例,在2.0時初始化對象成員,我們以這種方式實現:
User user = new User();
user.Name = "小王";
user.Age = 28;
在3.0中,實現對象初始化有了更好的解決方案,由對象初始化器來完成:
User user = new User { Name = "小王", Age = 28 };
同樣的方式可以用來實現集合的初始化和隱式類型的初始化等。
接著,我們再來了解一下自動屬性帶來的語法魅力,在3.0之前進行屬性封裝的是一件麻煩的事情,例如:
// Release : code03, 2009/05/07
// Author : Anytao, http://www.anytao.com
class User
{
private string name;
public string Name
{
get { return name; }
}
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
}
而自動屬性將這一切化簡為無形,語法簡單而功能依舊:
// Release : code04, 2009/05/07
// Author : Anytao, http://www.anytao.com
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
這些所有的新特性最終都為了一個共同的目標而鋪墊,這就是C# 3.0中最重量級的新特性:LINQ。所以,本文也不能少了對LINQ的討論,在代碼級別實現類似於SQL式的查詢語法,以類型安全的通用方式完成增、刪、改、查等數據操作的基本方式。只要數據源基於IEnumerable<T>接口而實現,那麼不管是關系型數據、內存中集合還是XML都可以作為LINQ查詢對象進行數據處理,這為面向對象語言實現函數式的編程體驗創造了條件,一種全新的編程風格為編程體驗刮來一股旋風:
// Release : code05, 2009/05/07
// Author : Anytao, http://www.anytao.com
public static void Main()
{
List<User> users = new List<User>
{
new User{Name = "小王", Age = 27},
new User{Name = "小張", Age = 29},
new User{Name = "小李", Age = 23}
};
IEnumerable<User> result = from user in users
where user.Age < 30
orderby user.Age descending
select user;
foreach (var user in result)
{
//執行操作
}
}
你看,這種體驗果然非同凡響,優雅而簡單沒有辜負Anders對於代碼美學的追求。而作為編程用戶,我們同樣體味了這種理念在功能和結構上的雙重精彩。
出處:http://anytao.cnblogs.com/