年初許下要把 C# in Depth 看完的宏願,隔週還上演電子書失而復得的插曲。然而,一年都過完 3/4 了,新年新希望又爛尾了嗎?

要說沒爛尾是騙人的,平日有一搭沒一搭,想到才翻幾頁,按這速度,拖到領老人年金還看不完。這樣不行呀,黑大! 動筆開始寫讀書筆記吧,希望起點催速效果。

C# in Depth 作者 Jon Skeet,號稱全世界最會回答問題的辣個男人,就是各種程式語言救公主漫畫裡那個 Jon Skeet (他還把 Stackoverflow 頭貼換成漫晝裡的自己)。實際閱讀,他的解說跟英文的確蠻友善易讀,但必須先說,這不是一本 C# 語言入門書,不適合不熟 C# 的新同學。但如果有一定的 C# 開發經驗,這本書可讓你從「知其然」提升到「知其所以然」,從而領略 C# 語言設計背後的精神。有點像先有武術基礎,再修習內力心法,功力必能有所提升。

我看的是第四版,涵蓋到 C# ..,全書分為四部分。第一部分講述 C# 語言歷史及概覽,第二部分介紹 C# 2 到 C# 5 的演進、async/await,第三部分談 C# 6 的 Expression-Bodied Members、Automatically Implemented Property、String Interpolation、nameof.. 等,第四部分談 C# 7 的 ValueTuple、解構式、Pattern Matching、ref returns、ref locals 並會談到一點 C# 8 (當時還在 Preview 階段)。

既然是我的筆記,會從我的視角著重我過去理解較淺或覺得有趣的部分,可能忽略某些重要但我熟稔的環節,也會加入我的觀點想法。大家如想完整吸收原汁精華,原作值得一讀。

好囉,第一部分開始,C# 歷史簡要介紹。

  • C# Team 擅於向其他語言的好點子致敬,努力將其融入活用。所以,你說這個是抄 XXXX 的?So What,讓程式寫起來更開心,不好嗎?
  • C# 是一個強型別語言,當程式碼不到一頁(或長過一頁但能一次記在腦裡)看不到好處,但當程式規格大且複雜時,就能感受到它的好。
  • C# 2.0 支援 Generic 是重要的一步,還有 Nullable<T> 讓「未設定」更明確,C# 8 再加入 Nullable Refernce Type。
  • C# 3 的匿名型別跟 var 宣告讓程式碼簡潔化。
  • 用一個例子看 C# 的簡潔優化
    C# 1 button.Click += new EventHandler(HandleButtonClick);
    C# 2 button.Click += HandleButtonClick;
    C# 2 button.Click += delegate { MessageBox.Show("Clicked"); };
    C# 3 button.Click += (sender, args) => MessageBox.Show("Clicked");
  • C# 3 Object Intializer 與 Collection Initializer
var obj = new SomeObject { PropA = "..." }
var list = new List<string> { "...", "..." }
  • C# 3 Autmatically Implemented Property
public class Foo 
{
    public string SomeProp { get; private set; }    
}
  • C# 6 Expression-Bodied Members
public class Foo 
{
    public Guid GetGuid => Guid.NewGuid();
    public DateTime GetTime() => DataReader.ReadTime();    
}
  • C# 6 String Interpolation @"... ..." 延伸閱讀:Interpolated Strings 字串插值
  • C# 6 nameof() 延伸閱讀:C# 技巧:用列舉及 nameof 取代字串常數提高可維護性
  • C# 5 async/await,這部分較複雜,之後再詳細談
  • C# 7 焦點在效能:Read-Only Struts、Span<T>
  • C# 7 起又開始有次版號(最早有 1.0 及 1.2,之後 2 到 6 都是 .0),7.0、7.1、7.2、7.3。C# 編譯器預設會用 7.0 Build,當你用到 7.3 才有的功能時,編譯器會明確提示應改用 7.3 編譯。如果是主版號差異,例如用 C# 6 編譯 C# 7 才有語法時只會噴出不認識該寫法的錯誤訊息。
  • Unity,最受歡迎的遊戲開發平台之一,使用 Mono/C#。Blazor,用 C# 寫 WebAssembly。
  • 最早 C# 被視企業用的程式語言,枯躁單調,但時至今日,C# 的生態系統已成長到跟 Java 一樣興盛,可以用來做各式各樣有趣應用。
  • 2010 NuGet 讓程式庫下載安裝變簡單
  • 2014 Roslyn、.NET Core 將 .NET 推向開放、跨平台,後來的事我們已經知道了,一路由 .NET Core 3.1、.NET 5、.NET 6 到下個月要推出的 .NET 7,.NET 已可視為成熟的跨平台框架。延伸閱讀:告別 .NET Framework ,迎向 .NET 5
  • 第四版重點放在 C# 5.0 之後的版本,C# 2-4 只保留概略介紹,想深入可回頭看 C# in Depth 第三版。
  • 書會引用 Jon 的 Side Project - Noda Time 程式庫部分程式當範例

整理 C# 各版本與 .NET/VS 對照表如下:(資料來源:Wiki)

然後 C# 11 也已進入 Preview 階段,年底就要正式推出。

面對程式語言版本不斷翻新,一般開發者很難不陷入焦慮,用 Jon 在書中分享的心法做結尾吧!

C# Team 會不斷為 C# 加入各式各樣新語法新功能,有許多在日常開發幾乎用不到。你不必因為有新東西就非用不可,衝量複雜度及效益,想清楚再用。

I just want to point out that you don’t have to use a feature just because it’s there. Make your decision to opt into complexity a conscious one.

My notes for C# in Depth part 1


Comments

# by 樂透無名

來襄盛舉 (拍掉灰塵先)

# by 樂透無名2

是 共襄盛舉 歉

# by 小雞

英文好差 看不懂原文電子書= =|||

# by Ryan

博大精深 :)

Post a comment