1. 簡化的異步編程
C#和VB都支持了新的async & await語法以簡化異步編程,.Net Framework中也相應增加了相關的函數以輔助。一個比較醒目的變化就是在IO操作中多了許多XXXAsync的函數,另外,線程操作的Task類中也新增了不少靜態函數。
2. 只讀集合接口
長期以來,BCL中提供的只讀集合只有IEnumerable<T>,它主要存在如下問題:
-
每次訪問都需要迭代,如果多次訪問則導致性能較差。
-
不支持統計元素個數
-
不支持隨機訪問或查詢訪問
由於C#不像C++那樣能返回const只讀對象,如果直接返回List或Dictionary引用的話又有集合被調用方修改的風險,有的時候,為了防止集合被修改,我們甚至通過ToArray這種比較低效的方法返回一個副本。
.Net 4.5中增加了IReadOnlyList<T>和IReadOnlyDictionary<TKey, TValue>兩個只讀集合接口(它們有公共的父接口IReadOnlyCollection),它們是支持協變的,這樣我們返回集合的時候就可以直接返回只讀集合了。
3. zip存檔支持
.Net 4.5中增加了ZipArchive類實現對Zip文件的管理,由於考慮到了Metro程序不支持文件系統,它的功能被拆分到了兩個Dll。
-
System.IO.Compression.dll 此程序集包含通用 .zip 功能, 它不支持文件路徑。 此程序集中的主類是 ZipArchive。
-
System.IO.Compression.FileSystem.dl 此程序集提供 ZipFile 靜態類以定義擴展方法和靜態幫助程序。
PS:個人感覺這個設計比較蛋疼,用個Zip還需要引用兩個Dll,完全可以合並成一個或全部塞到mscrolib里面去,對於Metro程序直接把不支持的給裁剪了即可。另外,這個庫不支持帶密碼的zip文件,不知道設計者是怎么想的。
4. HttpClient
.Net 4.5中新增了一個HttpClient類專門用於Http操作,十分小巧好用,我以前寫過一篇文章介紹他-- .Net 4.5中的HttpClient試用,這里就不多說了。
5. WebSocket
.Net 4.5中,在System.Web.WebSockets和System.Net.WebSocket名字空間實現了對WebSocket的支持,其中前者主要用於Asp.net框架。通過它可以快速建立自己的webSocket服務,我在文章HTML5中的WebSocket中也介紹過。不過它不支持win7,只能在win8上工作,這個限制使得它的工作范圍變得有限了不少。
6. WeakReference<T>
新提供的泛型WeakReference<T>解決了以前的WeakReference存在的兩個問題:1. 需要類型轉換,2. 不可靠的IsAlive屬性(WeakReference<T>就把它給直接去掉了)。有了WeakReference<T>后,老版本的WeakReference該下崗了。
7. ArraySegment<T>
這個類本身在.Net 2.0中就已經有了,主要用於提供一個數組的子集,而無需復制副本。但它之前沒有什么接口方法,導致只能遍歷,限制太大。現在實現了IList接口,用起來方便多了。
8. Comparer<T>.Create
到了.Net 4.5,我們終於可以通過一個lambda表達式構造一個IComparer<T>對象了,一直以為這個應該是在.Net 2.0時代就應該提供的功能。
9. SemaphoreSlim.WaitAsync
這個是系統內置的唯一一個異步鎖,如果覺得不夠用,請參看我以前的文章--基於TPL異步編程的同步和互斥的類庫。
10. StreamReader、StreamWriter等不釋放基礎流的選項
BinaryReader、BinaryWriter、StreamReader、StreamWriter等流讀寫類的構造函數中增加了leaveOpen參數,以控制它們放棄對基礎流的托管。也就是說,在StreamReader關閉的時候,可以選擇不關閉其基礎流。
11. Regex.Timeout
正則表達式終於支持超時了,雖然用到的地方感覺不是很多,但還是比較有用的。
12. CancellationTokenSource支持超時自動取消
不多介紹了,請參考我以前的文章-- .Net 4.5中通過CancellationTokenSource實現對超時任務的取消。
其他兩個非BCL中的類庫
1. TPL Dataflow (TDF)
TPL Dataflow是微軟面向高並發應用而推出的新程序庫,很好很強大,不知道為什么微軟沒有把它合並到BCL中,而是單獨做一個庫發行,可以通過NUGET或在TDF的官網下載。這個庫接口不多,但非常好用,有空的話我專門寫幾篇文章來描述一下他,不過目前對它的資料不是很多,有的細節還是了解的不清楚。
2. Roslyn
編譯器即服務(Compiler as a Service)是C# 5.0的核心功能之一,我以前在文章通過Roslyn構建自己的C#腳本介紹過它的部分功能。不過Roslyn的開發進度好像趕不上VisualStudio的發布,目前還是CTP版本(Anders大牛忙着搞TypeScript去了? O(∩_∩)O~),不過實現的功能已經比較全了,想嘗鮮的朋友可以在微軟的網站或NUGET上下載。