C# 版本特性一覽

来源:https://www.cnblogs.com/gaoyunpeng/archive/2023/06/06/17459660.html
-Advertisement-
Play Games

## 前言 使用 C# 作為開發語言已經 15 個年頭了,受惠於 C# 的不斷更新,伴隨著大量的新特性與大量語法糖,讓我更加容易寫出簡潔、高效的代碼。日常中大量特性早已信手拈來,當然從未嘗試過的特性更是難以盡數,但是每每回憶代碼中的特性究竟是哪個版本引入的,卻頗為含糊。索性簡單整理記錄下來,用以備忘 ...


前言

使用 C# 作為開發語言已經 15 個年頭了,受惠於 C# 的不斷更新,伴隨著大量的新特性與大量語法糖,讓我更加容易寫出簡潔、高效的代碼。日常中大量特性早已信手拈來,當然從未嘗試過的特性更是難以盡數,但是每每回憶代碼中的特性究竟是哪個版本引入的,卻頗為含糊。索性簡單整理記錄下來,用以備忘,進而能夠更精確地根據想使用的特性確定程式需要的 Framework 版本。
儘管參考了微軟的官方文檔,但所列特性難免基於我所接觸使用到的狹隘範圍,用中括弧附上短評(如【我是短評】),用以提示,希望不至於畫蛇添足吧。

版本一覽

C# 1.0

發佈日期:2002 年 1 月
一切的開始,由於我是從 2.0 開始接觸 C# 的,在此不贅述該版本了,只能說 C# 的起點不低,從 Java 轉過來上手很快,兼具 C 語族的語法特點,同時又很有 Delphi 味,簡直夢幻開局。

C# 1.2

發佈日期:2003 年 4 月
從此版本開始,當 IEnumerator 實現 IDisposable 時,foreach 迴圈中生成的代碼會在 IEnumerator 上調用 Dispose。【剛剛知道還有這特性】

C# 2.0

發佈日期:2005 年 11 月
和 Visual Studio 2005 一起發佈。看看這些金光閃閃的特性吧:

  • 泛型
  • 分部類型【partial 關鍵字】
  • 匿名方法【利用 delegate 運算符】
  • 可為空的值類型【Nullable<T>T?
  • 迭代器【yield return 語句】
  • 協變和逆變【這時候還不支持泛型介面和委托】
  • getter/setter 單獨可訪問性
  • 靜態類

C# 3.0

發佈日期:2007 年 11 月
C# 3.0 和 Visual Studio 2008 一起發佈於 2007 年下半年,但完整的語言功能是在 .NET Framework 3.5 版中發佈的。如果說 2.0 時期是分庭抗禮,那麼到了 3.0 就真的是一騎絕塵,諸多特性完美地結合在一起。儘管我習慣用 Lambda 表達式與鏈式調用來寫 LINQ ,但是查詢表達式寫法的 LINQ 實在是太驚艷了。

  • 自動實現的屬性【{ get; set; } 寫法】
  • 匿名類型【new { Foo = 108, Bar = "Hello" } 寫法】
  • 查詢表達式【from foo select bar where baz 寫法】
  • Lambda 表達式
  • 表達式樹
  • 擴展方法
  • 隱式類型本地變數【var 關鍵字】
  • 分部方法【partial 關鍵字可以作用在方法上,沒用過該特性】
  • 對象和集合初始值設定項【Foo foo = new Foo { Bar = "Hello" } 寫法】
  • WPF、WCF、WF

C# 4.0

發佈日期:2010 年 4 月
C# 版本 4.0 隨 Visual Studio 2010 一起發佈,引入了一些小改進。

  • 動態綁定【dynamic 關鍵字,不在編譯時檢查類型,而是在運行時評估。】
  • 命名實參和可選實參【可以少些一些方法重載了】
  • 泛型協變和逆變【完全體,但一般只有底層類庫設計者需要考慮這玩意】
  • 嵌入的互操作類型【沒什麼存在感】
  • System.Threading.Tasks 命名空間【更方便的線程操作及並行處理】
  • System.Tuple
  • 現有類的新方法【例如 String.IsNullOrWhiteSpaceStopwatch.RestartStringBuilder.Clear 等等】
  • 現有方法的新重載【例如 String.Join 方法添加了可以連接 IEnumerable<T> 集合的成員的新重載。】
  • Managed Extensibility Framework (MEF)【動態載入,實現插件系統的好幫手】
  • ASP.NET MVC

C# 5.0

發佈日期:2012 年 8 月
C# 版本 5.0 隨 Visual Studio 2012 一起發佈。.NET Framework 4.5、4.5.1、4.5.2 基本上就是一系列更新和優化,新東西很少。

  • 非同步成員【asyncawait,版本之子。】
  • 調用方信息特性【CallerMemberName 等,方便確定調用方信息。】

C# 6.0

發佈日期:2015 年 7 月
版本 6.0 隨 Visual Studio 2015 一起發佈,發佈了很多使得 C# 編程更有效率的小功能。對應 .NET Framework 4.6、4.6.1、4.6.2。.NET Core 出現了,好消息是 .NET 開放源碼了,壞消息是微軟開始折騰,從這開始語法糖多得齁嗓子。得益於諸多新特性,代碼變得簡短了,但是引入了很多新符號,心智負擔加重了。“Null 條件運算符”、“字元串內插”、“nameof 表達式”是我比較喜歡的特性。

  • 靜態導入【using static 指令命名了一種類型,無需指定類型名稱即可訪問其靜態成員和嵌套類型。】
  • 異常篩選器【catch (ExceptionType [e]) when (expr)
  • 自動屬性初始化表達式【public string Foo { get; set; } = string.Empty;
  • 表達式主體定義【例如:public override string ToString() => $"{foo} {bar}";
  • Null 條件運算符【成員訪問?. 或元素訪問?[]
  • 字元串內插【$"{foo} {bar}"
  • nameof 表達式【nameof(Foo)

C# 7.0

發佈日期:2017 年 3 月
C# 7.0 版已與 Visual Studio 2017 一起發佈。 此版本繼承和發展了 C# 6.0。對應 .NET Framework 4.7、4.7.1、4.7.2。“out 變數”、“模式匹配”是我比較喜歡的特性。後續的 C# 7.1、7.2、7.3 基本都在為新特性添磚加瓦。明顯開始和別的語言抄來抄去,當然我們一般都稱為“借鑒”。

  • out 變數【if (Int32.TryParse(foo, out int bar)) Console.WriteLine($"Converted '{foo}' to {bar}");
  • 元組【(double Foo, int Bar) t2 = (4.5, 3);
  • 模式匹配
  • 本地函數【內部函數,讓我想起了 Delphi】
  • ref 局部變數【指針既視感】
  • 棄元【(_, _, foo) = bar.baz();,配合元組,你可以給,但我可以不要。】

C# 8.0

發佈日期:2019 年 9 月
C# 8.0 版是專門面向 .NET C# Core 的第一個主要 C# 版本。特性列了一大篇,實在是沒法看了,下麵就沒有一一列舉,腳本語言味兒越來越重,各種操作符、關鍵字更是玩出花來,心智負擔越發沉重了。除了模式匹配,別的特性完全不想碰。

  • 預設介面方法【抽象也能順便帶點兒實現,腦抽特性】
  • 模式匹配增強功能【來嘛,有點學不過來了啊】
  • Null 合併賦值【??=
  • 後面懶得列了……

C# 9

發佈日期:2020 年 11 月
C# 9 隨 .NET 5 一起發佈。 它是面向 .NET 5 版本的任何程式集的預設語言版本。對於既存特性進行了梳理與調整,然後引入了一大堆新特性,這是有 KPI 壓力嗎?老特性千萬別給我搞沒了,新特性我也保證不碰,咱們心照不宣吧。

  • 記錄【record 關鍵字,只讀數據類語法糖】
  • 僅限 Init 的資源庫【public int Foo { get; init; } ,只讀數據類語法糖之二】
  • 頂級語句【為了少寫點代碼微軟也是拼了】
  • 模式匹配增強功能【繼續增強……】
  • 函數指針【圖窮匕見,高性能計算這一塊與我似乎沒有交集】
  • 後面懶得列了……

C# 10

發佈日期:2021 年 11 月
C# 10 繼續致力於刪除不必要的模式、將數據與演算法分離以及提高 .NET 運行時的性能等主題。特性列表又是像寫小說一樣長,行吧,你開心就好。

  • 這次我一個也不想列……

C# 11

發佈日期:2022 年 11 月
和前面比起來稍微節制了一點兒,優化了數學計算和字元串處理,模式匹配不用說,給我增強!

  • 泛型數學支持【不懂】
  • UTF-8 字元串字面量【"foo"u8】
  • 必需的成員【required 修飾符,KPI 味太濃了】
  • 其他的不列了……

後記

可以說從 6.0 開始就不幹正事兒了,有實際意義的特性越來越少,性能增強、安全性加強什麼的是值得肯定的,但是加的這一堆特性真是有點缺乏節制,我寧可在 11 的環境下寫著 6 的代碼。人家是“人生苦短”,我看微軟是“只嫌命長”啊。

作者:高雲鵬 出處:https://gaoyunpeng.cnblogs.com/ 知識共用許可協議
本作品採用知識共用署名-非商業性使用 4.0 國際許可協議進行許可。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # if語句-語法格式 簡單理解if語句之後,我們的if語句語法格式有多種,選擇使用哪種取決於要測試的條件數 # 1.if結構 最簡單的if語句只有一個條件測試和一個代碼塊 其語法格式: ![image](https://img2023.cnblogs.com/blog/3179433/202306 ...
  • #### 使用thymeleaf做html模板,由xhtmlrenderer/flying-saucer-pdf-openpdf將html轉為PDF > LGPL 和 MPL 許可 #### pom.xml引入依賴 ````java org.springframework.boot spring-b ...
  • > 文中所涉及到的代碼運行結果均是在64位機器上執行得到的. ## 基礎知識回顧 在Go中,我們可以使用`unsafe.Sizeof(x)`來查看變數所占的記憶體大小。以下是Go內置的數據類型占用的記憶體大小: | 類型 | 記憶體大小(位元組數) | | : | : | | bool | 1 | | in ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • ## 教程簡介 Ajax即Asynchronous Javascript And XML(非同步JavaScript和XML)在 2005年被Jesse James Garrett提出的新術語,用來描述一種使用現有技術集合的‘新’方法,包括: HTML 或 XHTML, CSS, JavaScript ...
  • ## 前言 本人之前開發了一個叫[電子腦殼](https://github.com/maker-community/ElectronBot.DotNet)的上位機應用,給稚暉君[ElectronBot](https://github.com/peng-zhihui/ElectronBot)開源機器人 ...
  • # SignalR+Hangfire 實現後臺任務隊列和實時通訊 1.簡介: SignalR是一個.NET的開源框架,SignalR可使用Web Socket, Server Sent Events 和 Long Polling作為底層傳輸方式實現服務端和客戶端的實時數據交互。 Hangfire是一 ...
  • > > 傳統桌面客戶端的遠程調試相比`UWP`,`ASP`等項目來說,配置比較麻煩,因為它是非部署的應用程式,原理是複製編譯的文件到遠程電腦,通過網路來連接和`VS`的通信,本文主要講述`WPF`,`WinForm`應用程式的遠程調試。 ![](https://learn.microsoft.co ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...