程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> [你必須知道的.NET]第三十回:.NET十年(下)

[你必須知道的.NET]第三十回:.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#實現面向對象編程帶來強大的功能動力和美學感受。

出處:http://anytao.cnblogs.com/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved