.Net Framework 4.5 新特性
最近面試時又看到有問.Net Framework 新特性的問題,一時被問到了。平時也是拿起來就用,新版本出來了,新特性也就是瞄一眼,也沒去仔細查看。這次干脆花點時間總(翻)結(譯)一下各個版本相比上一版本帶來的新特性。主要參考來源是MSDN,一下是原文鏈接:
Reference: https://msdn.microsoft.com/en-us/library/ms171868(v=vs.110).aspx#core
嗯,我們就從4.5開始。
目錄 Table Of Content
2. 托管擴展框架
3. 異步文件操作
4. 工具
5. 並行計算
6.網站
7. 網絡編程
8.WPF
9.WCF
10. WF
11.可移植類庫
1. 核心特性和改進
1) . 在安裝Framework 4.5的時候減少了系統重啟的需要。應為4.5 安裝時需要替換4.0的部分文件,所以要求這些文件在安裝時可被替換(可寫)。4.5引入了一個重啟管理器(Restart Manager),它可以檢測到正在運行的4.0的程序,並嘗試關閉這些程序(會有提示框讓用戶確認要關閉的程序),以此來避免重啟系統。但是有是一些程序不能或不應該關閉的,那就還是需要重啟系統。
如果你要發布自己的程序並自帶Framework 安裝包(Chained Instaler),也可以通過設置命令行選項的方式,讓用戶在安裝你的程序包是出現.Framework自帶的關閉程序提示框。
參考: https://msdn.microsoft.com/en-us/library/hh527997(v=vs.110).aspx
PS: 這個新特性似乎用處不大,在開發環境重不重啟系統無關緊要,重啟的時候還可以趁機看看頭條。生產環境的話,又不是100%不需重啟,似乎並沒有起到什么大作用。
2). 在64位系統上支持超過2GB的大數組。但是要是有此特性需要在配置文件中設置 gcAllowVeryLargeObjects 配置項:
<configuration> <runtime> <gcAllowVeryLargeObjects enabled="true" /> </runtime> </configuration>
PS:沒用過這么大的數組,什么場景會用到這么大的數組呢?
3). 開始支持服務器的后台垃圾回收。從4.0開始有后台垃圾回收,但是只支持工作台(WorkStation)環境。4.5開始支持服務器。 垃圾回收會自我調節一適應不同的場景。我們可以根據工作量的特點。通過修改配置文件的設置來設定垃圾回收的類型。目前CLR提供了兩種垃圾回收的類型:工作台和服務器。
工作台垃圾回收適用於各種客戶端工作台以及獨立PC.它是 配置文件中<runtime>/ <gcserver> 的默認設置。它可以以並發或非並發模式運行。並發模式下垃圾回收和托管主線程同時運行。從4.0開始,后台垃圾回收替代了並發垃圾回收。
服務器垃圾回收適用於高吞吐和擴展的服務器應用程序。服務器垃圾回收可以是非並發或后台。
對於后台垃圾回收,它會在一個單獨的線程中執行,而且只在2代堆上執行垃圾回收。
在0和1代(ephemeral generations)的對象是使用前台垃圾回收(Foreground Garbage colletion), 前台垃圾回收啟動時,后台垃圾回收線程和程序主線程都會掛起直到回收結束再恢復。
Reference: https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx#background_garbage_collection
4).在多核處理器系統上,可以支持后台JIT 編譯,以提升程序啟動速度。
Reference: https://msdn.microsoft.com/en-us/library/system.runtime.profileoptimization(v=vs.110).aspx
5).可以設置正則表達式引擎的超時時間。以前版本中是沒有超時時間的。這個時間可以單獨在創建是設置在Regex對象上或設置在AppDomain 中應用於所有的Regex對象。默認值是Regex.InfiniteMatchTimeout, 無超時。
using System; using System.Text.RegularExpressions; public class Example { public static void Main() { AppDomain domain = AppDomain.CurrentDomain; // Set a timeout interval of 2 seconds. domain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromSeconds(2)); Object timeout = domain.GetData("REGEX_DEFAULT_MATCH_TIMEOUT"); Console.WriteLine("Default regex match timeout: {0}", timeout == null ? "<null>" : timeout); Regex rgx = new Regex("[aeiouy]"); Console.WriteLine("Regular expression pattern: {0}", rgx.ToString()); Console.WriteLine("Timeout interval for this regex: {0} seconds", rgx.MatchTimeout.TotalSeconds); } } // The example displays the following output: // Default regex match timeout: 00:00:02 // Regular expression pattern: [aeiouy] // Timeout interval for this regex: 2 seconds
Reference:https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.matchtimeout(v=vs.110).aspx
6).可以為AppDomain 設置默認Culture.
Reference: https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo(v=vs.110).aspx
7).控制台Console 支持UTF-16 編碼。
8).在字符串的排序和比較是支持不同文化版本的編碼.
9).讀取資源時有更好的性能。
10).改進Zip壓縮,減少了壓縮后文件的大小。
11).可自定義一個反射上下文,覆蓋默認的反射行為。反射上下文的作用就是在提供一種在運行時修改被反射類型的成員或方法的屬性(Attribute).比如加一個源代碼中沒有屬性,或者去掉一個源代碼中有的屬性。這樣利用反射獲取類型成員或方法的屬性時就獲取的是自定義的屬性。
Reference:https://msdn.microsoft.com/en-us/library/system.reflection.context.customreflectioncontext(v=vs.110).aspx
12).當類System.Globalization.IdnMapping 在Win8上使用是,支持2008版本的IDNA(Internationalized Domain Names in Applications).類System.Globalization.IdnMapping 是支持非ASCII編碼的因特網域名。
Reference: https://msdn.microsoft.com/en-us/library/system.globalization.idnmapping(v=vs.110).aspx
13).當.Net Framework 運行在Win8上時,字符串的比較會代理給實現了Unicode 6.0的操作系統。如果在其他平台上運行,.Net Framework 使用它自己的字符串比較,是基於Unicode5.X 。
14).可基於應用程序域計算字符串的哈希碼。
15).類型反射支持Type 和 TypeInfo 類之間的拆分。