.NET十年(下)

作者: Anytao  來源: 博客園  發布時間: 2010-11-09 21:19  閱讀: 1298 次  推薦: 0   原文鏈接   [收藏]  
摘要:本文不欲計較門派的高下,旨在明辨技術的真諦,這就是.NET平臺下的開發利器:C#語言,并從其變遷的進程中對于.NET技術發展把玩一番。

  相關文章:.NET十年(上)

  引言

  語言是程序開發者行走江湖的手上利器,各大門派的高手在論壇、博客為了自家門派爭吵不已早是技術世界中的亮麗風景,雖多少為剛剛踏入江湖的新手提供了思考的素材,但也同時迷惑了初出茅廬的前行方向。

  本文不欲計較門派的高下,旨在明辨技術的真諦,這就是.NET平臺下的開發利器:C#語言,并從其變遷的進程中對于.NET技術發展把玩一番。

  本篇,我們將從歷史走來,對.NET的未來做個展望性的了解,具體而言就是.NET 4.0的新東西。

  .NET之,未來武器

  無論如何,.NET 4.0已經在叩開新年的大門之時,以高調的姿態迎來一片掌聲。廣大的技術愛好者不會等待太長的時間,就能感受C#發展中的又一次變革。隨著.NET 4.0在2009年的發布,我們對于C# 4.0的關注也將與日俱增。總體而言,C# 4.0的重頭戲主要著眼在以下幾個方面:

  • 動態編程
  • 并行計算
  • 后期綁定
  • 協變與逆變

  廢話少說,接下來我們一一領略C# 4.0中的語言特性。

  動態編程

  眾所周知,C#是靜態強類型語言。而在很多情況下,提供“動態”行為,是常常發生的事情,例如通過反射在運行時訪問.NET類型、調用動態語言對象、訪問COM對象等,都無法以靜態類型來獲取。因此, C# 4.0引入的又一個全新的關鍵字dynamic,也同時引入了改善靜態類型與動態對象的交互能力,這就是動態查找(Dynamic Lookup)例如:

 
// Release : code06, 2009/05/07
// Author : Anytao, http://www.anytao.com
public static void Main()
{
dynamic d
= GetDynamicObject();
d.MyMethod(
22); // 方法調用
d.A = d.B; // 屬性賦值
d[“one”] = d[“two”]; // 索引器賦值
int i = d + 100; // 運算符調用
string s = d(1,2); // 委托調用
}

  就像一個object可以代表任何類型,dynamic使得類型決斷在運行時進行,方法調用、屬性訪問、委托調用都可動態分派。同時,動態特性還體現在構建一個動態對象,在C# 4.0實現IDynamicObject接口的類型,可以完全定義動態操作的意義,通過將C#編譯器作為運行時組件來完成由靜態編譯器延遲的操作,例如:

 
dynamic d = new Foo();
string s;

d.MyMethod(s,
3, null);

  在具體執行過程中,C#的運行時綁定器基于運行時信息,通過反射獲取d的實際類型Foo,然后在Foo類型上就MyMethod方法進行方法查找和重載解析,并執行調用,這正是動態調用的背后秘密:DLR。在.NET 4.0中將引入重要的底層組件DLR(Dynamic Language Runtime,動態語言運行時),除了實現動態查找的基礎支持,DLR也同時作為基礎設施為類似于IronRuby、IronPython這樣的動態語言提供統一的互操作機制。總而言之,動態編程將為C#在以下領域產生巨大的變革:

  • Office編程與其他COM交互。
  • 動態語言支持,在C#中消費IronRuby動態語言類型將并非難事,體驗動態語言特性指日可待。
  • 增強反射支持。

  以調用IronRython為例,我們只需引入IronPython.dll, IronPython.Modules.dll, and Microsoft.Scripting.dll,即可通過創建ScriptRuntime在C#中HostingIronPython環境,進而來操作動態語言的類型信息。

 
ScriptRuntime py = Python.CreateRuntime();
dynamic mypy
= py.UseFile("myfile.py");

Console.WriteLine(mypy.MyMethod(
"Hello"));

  雖然從微軟當前提供的技術資料和CTP演示中,動態查找還存在或多或少的問題,但是在“動態”大行其道的今天,我們無法回避也必須擁抱這個未來的主角,因為我堅信明天會更好。

  并行計算

  并行計算的出現,是計算機科學發展的必然結果,隨著計算機硬件的迅猛發展,在多核處理器上工作已經是既存事實,而傳統的編程模式必須兼容新的硬件環境才能使計算機性能達到合理的應用效果。用Anders大師的話說:未來5到10年,并行計算將成為主流編程語言不可忽視的方向,而4.0為C#打響了實現并發的第一槍。

  未來的.NET Framework 4.0中將集成TPL(Task Parallel Library)和PLINQ(Parallel LINQ),這也意味著未來我們可以應用C# 4.0實現并行化應用,在統一的工作調度程序下進行硬件的并行協調,這將大大提高應用程序的性能同時降低現存并發模型的復雜性。

  那么,我們應該一睹為快應用C#武器來開發并發環境下的超酷感受,在System.Threading.Parallel 靜態類提供了三個重要的方法For、Foreach、Invoke可以為我們小試牛刀:

 
//應用TPL,執行并行循環任務
Parallel.For(0, 10, i =>
{
DoSomething(i);
});

  在線程爭用執行情況下,相同的操作在雙核平臺下運行,以StopWatch進行精確時間測試,并行環境下的執行時間為 2001ms,而非并行環境下的執行時間為4500ms,并行運算的魅力果然名不虛傳。我們再接再厲應用PLINQ執行對于并行運算的查詢、排序等,當前PLINQ支持兩種方式ParallelEnumerable類和ParallelQuery類,例如:

 
int[] data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] selected = (from x in data.AsParallel()
select x
+ 1).ToArray();

  更詳細的對比示例留待讀者在實踐中對此進行討論,并行計算為托管代碼在多核環境下的性能優化提供了統一的解決方案,而未來我們會做的更好。

  備注:實際上,我們可以選擇下載安裝Microsoft Parallel Extensions to the .NET Framework 3.5June 2008 CTP包,就可以在.NET 3.5環境下體驗并行計算的無窮魅力。

  協變和逆變

  協變和逆變,是為解決問題而生的。而要理清解決什么樣的問題,需要首先從理清幾個簡單的概念開始。首先我們進行一點操作:

 
Derived d = new Derived();
Base b
= d;

  Derived類型繼承自Based類型,由Derived引用可以安全的轉換為Based引用,而這種轉換能力可以無縫的實現在Derived數組和Base數組,例如:

 
Derived[] ds = new Derived[5];
Base[] bs
= ds;

  而這種原始轉換(由子類轉換為父類)方向相同的可變性,被稱為協變(covariant);其反向操作則被稱為逆變(contravariant)。當同樣的情形應用于泛型時,例如:

 
List<Derived> ds = new List<Derived>();
List
<Base> bs = ds;

  類似的操作卻是行不通的。所以,這就成為C# 4.0中完善的問題——泛型的協變與逆變:

 
// Release : code07, 2009/05/07
// Author : Anytao, http://www.anytao.com
List<Base> bs = new List<Base>();
List
<Derived> ds = new List<Derived>();

bs
= ds; //List<T>支持對T協變
ds = bs; //List<T>支持對T逆變

  而在C# 4.0中,伴隨著協變與逆變特性的加入,C#引入兩個in和out關鍵字來解決問題。

 
// Release : code08, 2009/05/07
// Author : Anytao, http://www.anytao.com
public interface ICovariant<out T>
{
T MyAction();
}


public interface IContravariant<in T>
{
void MyAction(T arg);
}

  其中,out表示僅能作為返回值的類型參數,而in表示僅能作為參數的類型參數,不過一個接口可以既有out又有in,因此既可以支持協變、支持逆變,也可以同時支持,例如:

 
public interface IBoth<out U, in V>
{
}

  命名參數和可選參數

  命名參數和可選參數是兩個比較簡單的特性,對于熟悉其他編程語言的開發者來說可選參數并不陌生,為參數提供默認值時就是可選參數:

 
// Release : code09, 2009/05/07
// Author : Anytao, http://www.anytao.com
public void MyMethod(int x, int y = 10, int z = 100)
{
}

  因此,我們可以通過調用MyMethod(1)、MyMethod(1, 2)方式來調用MyMethod方法。而命名參數解決的是傳遞實參時,避免因為省去默認參數造成的重載問題,例如省去第二個參數y調用時,即可通過聲明參數名稱的方式來傳遞:

 
MyMethod(20, z: 200);

  相當于調用MyMethod(20, 10, 200),非常類似于Attribute的調用方式。雖然只是小技巧,但也同時改善了方法重載的靈活性和適配性,體現了C#語言日趨完美的發展軌跡。

  當然,除此之外.NET 4.0還增加了很多值得期待的平臺特性,也將為C#編碼帶來前所未有的新體驗。

  .NET之,趨勢不可逆轉

  預測未來,在技術世界是常有的事兒。從高級語言的發展歷史來看,編程世界從來就沒有停止過腳步,變革時時發生、創新處處存在。以技術人員的角度來觀摩未來,帶著C# 4.0的腳步來看展望, 除了在函數式編程、并行計算和動態特性上大展拳腳,Meta Programming的概念已然浮出水面,將編譯器變成一個Service,你可以自由控制在編譯器和運行期的邏輯,那是多么美好而向往的未來呀,所以,我們堅信 4.0之后還有廣闊的天地隨著語言的變遷變得更加開闊。

  概括Anders大師在C#設計過程中的思想,C#是語言美學的集大成者。例如,當使用foreach進行循環遍歷之后,當應用using語句代替try/finally實現強制資源管理,當應該attribute進行運行時反射,當以LINQ進行語言級別的信息查詢,這些語言級別的支持為C#實現面向對象編程帶來強大的功能動力和美學感受。

  注:本文代碼在VS2010 CTP基礎上開發,未檢測任何版本更新所帶來的不同,望明察。

  參考文獻

  (Web)http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

  (Web)http://weblogs.asp.net/podwysocki/archive/2008/05/24/what-is-the-future-of-c-anyways.aspx

  (Web)New features in C# 4.0

  (Web)http://msdn.microsoft.com/en-us/magazine/cc163340.aspx

  作者簡介:

  王濤,網名Anytao,微軟C# MVP,高級軟件工程師,機械工程碩士,《你必須知道的.NET》一書作者,主要研究方向為.NET底層架構和企業級系統應用。現就職于某軟件公司負責架構設計、軟件開發和項目管理方面的工作。作者對.NET基礎架構和CLR底層運行機制有濃厚的研究興趣和造詣,熟悉ASP.NET、XML、WCF、SQL Server相關技術,對面向對象、設計模式和軟件架構有一定的研究與實踐經驗。他的聯系方式如下:http://www.cnblogs.com/Anytao

0
0
 
標簽:.NET
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()