C#進化極簡史
來自專欄.NET Core筆記與思考
作為.NET平台編程語言中的「老大」C#是大部分.NET開發者選擇的語言,本篇我們就來聊聊C#的發展歷程。
起源
在.NET Framework開發期間,其類庫最初是使用一種被稱為Simple Managed C(SMC/簡單託管C)的編譯系統開發的。到了1999年初,安德斯·海爾斯伯格成立一個團隊開發一個被稱為Cool的程序語言,名稱取自「C-like Object Oriented Language」, 微軟曾經考慮過保留這個名字,但是由於商標等原因在2000年七月的開發者大會上公布.NET項目時將名稱改為C#。所以安德斯·海爾斯伯格就成了C#之父,同時他也是C# 首席設計師和微軟首席架構師。
安德斯·海爾斯伯格(Anders Hejlsberg)是一個編程天才,1960年12月2日出生於丹麥哥本哈根,曾在丹麥科技大學學習工程學,大學期間為MS-DOS和CP/M設計了Pascal編譯器,Borland買下該編譯器改稱Turbo Pascal。1989年他作為首席工程師加入Borland。在Borland期間他領導開發了Delphi和Turbo Pascal,所以他也是Turbo Pascal和Delphi之父。 1996年在比爾蓋茨親自邀請並使用「巨額」條件的誘惑下,安德斯離開Borland加入微軟,加入微軟之後首先主持了Visual J++的開發工作,後來由於在Java開發工具授權問題上和Sun公司的糾紛,微軟停止了Visual J++的後續開發。之後作為.Net概念的發起人之一,安德斯·海爾斯伯格被任命為微軟.Net的首席架構師,主持.Net的開發工作。2012他宣布了他的新項目TypeScript。
安德斯在《Dr.Dobbs》雜誌的2001年西部會議上被授予「Prestigious Excellence in Programming Award」,《Dr.Dobbs》雜誌的主編Jonathan Erickson說:「這一榮譽,我們每年只頒給那些在軟體開發領域做出非凡貢獻的人員,Anders開發的C#和他整個職業生涯中為軟體開發所做出的巨大貢獻有目共睹,他無愧於這一榮譽!」
現在 C# 是由 C# 語言設計團隊與實現該語言的 Roslyn 項目協作設計的,你可以在GitHub上找到他們的repo。
dotnet/csharplang名字
C# 讀作 c sharp [si???ɑrp],關於C#這個名字,它的歷史其實比.NET更早,微軟首次使用這個名字是在1988年設計一種C語言變體的時候,雖然這個項目沒有完成但是這個名字流傳了下來。
"C sharp"這個名字受到了五線譜中的升號#(sharp)的啟發,在五線譜中#表示升半個音。這和C++類似,"++"在代碼中代表了+1。同樣的#符號也可以看做是4個「+」號,可以看做是C++的「+1」。
大部分人可能不知道C#吉祥物Andy名字取自Anders Hejlsberg,下面是我在網上唯一能找到的相關圖片。不過該吉祥物於2004年退休。
開源
2014年11月12日,微軟宣布.NET平台全技術棧開源並且將讓.NET運行在Linux和MacOS上,並且會通過.NET Foundation(.NET基金會)來與社區密切合作在未來改進.NET。現在你可以在GitHub上找到所有.NET平台組件的開源項目。其中實現C#的Roslyn項目屬於Apache License 2.0授權,其他.NET平台組件如CLR與corefx(」標準庫「)為MIT授權。
.NET Foundation特點
C# 是一種多重範式,包含了強類型,指令式,聲明式,函數式,泛型,面向對象(基於類型)以及面向組件的編程語言,它是微軟為了推動.net平台而為CLI(公共語言基礎結構/common language infrastructure)開發的。
C# 同時也是ECMA和ISO等國際化標準組織的標準,標準規範可以在這裡下載ECMA-334 與 ISO/IEC 23270。
版本歷史及主要特性
下圖是C#各個版本的發行與簡要介紹
該圖來來自於wikipedia(2018年6月),點擊這裡查看最新版本。
版本特性:
2005年11月,C# 2.0
- Generics/泛型
- Partial types/部分類型
- Anonymous methods/匿名方法
- Iterators/迭代器
- Nullable types/可空類型
- Getter/setter separate accessibility/屬性訪問器可訪問性
- Method group conversions (delegates)/方法組轉化
- Co- and Contra-variance for delegates/委託中的協變和逆變
- Static classes/靜態類
- Delegate inference/委託推斷
Visual Studio 2005 文檔下載
2007年11月,C# 3.0
- Implicitly typed local variables/隱式類型的局部變數
- Object and collection initializers/對象與集合初始化器
- Auto-Implemented properties/自動屬性
- Anonymous types/匿名類型
- Extension methods/擴展方法
- Query expressions/查詢表達式
- Lambda expression/Lambda表達式
- Expression trees/表達式樹
- Partial methods/局部方法
Overview of C# 3.0
2010年10月,C# 4.0
- Dynamic binding/動態綁定
- Named and optional arguments/命名參數與可選參數
- Generic co- and contravariance/泛型逆變與協變
- Embedded interop types ("NoPIA")/嵌入互操作類型
C# 4.0 - New C# Features in the .NET Framework 4
2012年8月,C# 5.0
- Asynchronous methods/非同步方法
- Caller info attributes/調用方信息attributes(特性)
An Introduction to New Features in C# 5.0
2015年7月,C# 6.0
- Compiler-as-a-service (Roslyn) /編譯即服務(Roslyn)
- Import of static type members into namespace/支持僅導入類中的靜態成員
- Exception filters/異常過濾器
- Await in catch/finally blocks/在catch/finally語句中使用await
- Auto property initializers/自動屬性初始化
- Default values for getter-only properties/設置只讀屬性的默認值
- Expression-bodied members/支持以表達式為主體的成員方法和只讀屬性
- Null propagator (null-conditional operator, succinct null checking)/Null條件操作符
- String interpolation/字元串插值
- nameof operator/nameof操作符
- Dictionary initializer/字典初始化
Whats New in C# 6 - C# Guide
2017年3月,C# 7.0
- Out variables/out變數使用改進
- Pattern matching/模式匹配
- Tuples/元組
- Deconstruction/元組解析
- Local functions/本地方法
- Digit separators/數字分隔符
- Binary literals/二進位字面量
- Ref returns and locals/引用返回值和局部變數
- Generalized async return types/async中使用泛型返回類型
- Expression bodied constructors and finalizers/表達式構造與析構函數
- Expression bodied getters and setters/表達式屬性
- Throw can also be used as expression/throw可以在表達式中使用
Whats New in C# 7.0 - C# Guide
2017年8月,C# 7.1
- Async main/非同步main方法
- Default literal expressions/default關鍵字類型省略
- Inferred tuple element names/元組元素名稱推斷
Whats new in C# 7.1
2017年11月,C# 7.2
- Reference semantics with value types/新的值類型引用語意
- Non-trailing named arguments/命名參數不需放在尾部
- Leading underscores in numeric literals/二進位值支持下劃線
- private protected access modifier/新的可訪問性修飾符private protected
Whats new in C# 7.2
2018年5月,C# 7.3
- Access fixed fields without pinning/可在不fixed(pinning)的情況下訪問fixed欄位
- Reassign
ref
local variables/可重新賦值的ref局部變數 - Use initializers on
stackalloc
arrays/棧分配數組 - Use
fixed
statements with any type that supports a pattern/增加fixed語句支持類型 - Additional generic constraints/泛型約束增強
- Test
==
and!=
with tuple types/元組比較(使用==和!=) - Use expression variables in more locations/可在更多的地方使用表達式變數
- Attach attributes to the backing field of auto-implemented properties/支持為自動屬性的隱藏欄位添加特性(Attribute)
- Method resolution when arguments differ by
in
has been improved/方法解析增強 - Overload resolution now has fewer ambiguous cases/重載解析增強
Whats new in C# 7.3
希望通過這篇文章能讓大家對C#編程語言有更感性的認識。
註:資料主要來自於維基百科
更新日誌:添加7.3特性
推薦閱讀:
※如何優雅地產生一組符合正態分布的隨機數?
※如何評價ML.NET?
※如何看待.net core 2.1正式發布?
※NET Framework 為什麼只是重載了Double和Float浮點數的運算符?
※怎麼看待.net core 2.0發布?