善用C# 新版本特性

更新 發佈閱讀 4 分鐘

前情提要

我以前是很排斥變更Unity 版本的,一來要重新下載,二來重跑編譯不知道會不會出甚麼大事,尤其跨版更新那更是刺激,但隨著Unity 逐漸穩定,現在更新反而利大於弊,這篇就來說說近幾版C# 的語法糖與功能,順便水一篇

這篇主要講的是 C# 9.0 ! (Unity 2021 later )

new()

這算是最常用到的,對於超級懶人的我來說。直接上程式碼:

對於已知類型的情況下,直接打上 new() 來使用建構式建立對象。

這讓泛型的宣告變得簡短很多:

沒錯,方法的回傳值也有明確定義,所以也能使用這個語法糖。


模式匹配

這部分是最近在學 Rust 才注意到的功能,C#9.0 也新增了不少模式匹配的關鍵字,可以用更簡潔的方式把程式碼完成。先看一個簡單的例子:

這是一個簡單的方法,判斷輸入的分數應給出甚麼評語,這邊用到了 and 關鍵字,這正是奇妙的地方。
C#9.0 新增了 is / or / and / not 關鍵字 來強化模式匹配的撰寫彈性,但由於麻煩的運算順序,使用時最好要加上括號來確保條件的正確性,而且 不推薦與邏輯運算子混用

運作順序如下:
  not 👉 關係運算子 👉 and 👉 or

另外元組(Tuple)也能用解構的方式進行模式匹配:


Record

最後來說說 Record 這個特殊的類型。

先來看這段程式碼:

如果稍微熟悉 class 與 struct 特性的同學應該不難理解這個範例:

  • class 為 參考 物件,針對 記憶體位址 進行比對
  • class 指定時複製記憶體位址
  • struct 為 實值 物件,針對 進行比對
  • struct 指定時複製整個物件

而要介紹的 Record 正介於這兩者之間。上程式碼:

可以觀察到 Record 特性如下:

  • record 為 參考 物件
  • record 指定時複製記憶體位址
  • record 針對 進行比對


宣告

1. 精簡宣告:

如上面範例的單行宣告,因為會自動產生解構子,是我最常使用的宣告方式,拿來取代使用元組的情況。

使用精簡宣告會讓其屬性自帶不可變性,與 readonly 有一樣的效果。


2. 自訂宣告:

不會自動產生建構子、解構子,但能自訂屬性是否可變,也能賦予預設值。

  • L11: y 被宣告為唯讀,不能於建立時賦值
  • L15:z 被宣告為 init-only ,只有在建立時能賦值


另外, Unity 在使用 Record 時可能會報錯

未定義 'System.Runtime.CompilerServices.IsExternalInit'

只需要在專案內新增一段程式碼:

就能消除錯誤了。


非破壞性變異

使用 with 關鍵字來初始化 record ,能夠在不破壞原物件的情況下更改內容。

範例中 pr2 使用了 pr 的值,同時變更了 x

繼承

record 提供了繼承能力,且能使用 abstract 修飾詞。

結語

這次講了比較多跟程式碼相關的內容,比較枯燥乏味,但妥善運用的確能讓程式碼的維護性提升。C#也算是經過時間淬鍊的語言了,近幾版很多更新都漸漸讓工程師的創造力不再被語言所侷限,儘管微軟有股臭銅味還是非常值得誇獎,讚嘆一聲我大微軟爸爸。


留言
avatar-img
#Jaku的沙龍
6會員
10內容數
只要10分鐘!
#Jaku的沙龍的其他內容
2023/09/05
UPM 插件管理、匯入、打包
Thumbnail
2023/09/05
UPM 插件管理、匯入、打包
Thumbnail
2023/08/15
在其他語言會時常使用正規表達式來幫字串進行 Filter,在遊戲製作裡面比較遇不到處理使用者的字串輸入、資料庫查詢結果的情況,但在編輯程式碼,有搜尋(Ctrl+F)、取代(Ctrl+H)需求時使用 Regex 也能提升工作效率。
Thumbnail
2023/08/15
在其他語言會時常使用正規表達式來幫字串進行 Filter,在遊戲製作裡面比較遇不到處理使用者的字串輸入、資料庫查詢結果的情況,但在編輯程式碼,有搜尋(Ctrl+F)、取代(Ctrl+H)需求時使用 Regex 也能提升工作效率。
Thumbnail
2023/08/06
微軟想把 VS 的一些編輯功能在 VS Code 上實作, Unity 也在幾天前推出了基於 C# Dev Kit 的插件,因為新舊版本並不相容,這邊說明兩種(OmniSharp、Roslyn Analyzers)開發環境設置。
Thumbnail
2023/08/06
微軟想把 VS 的一些編輯功能在 VS Code 上實作, Unity 也在幾天前推出了基於 C# Dev Kit 的插件,因為新舊版本並不相容,這邊說明兩種(OmniSharp、Roslyn Analyzers)開發環境設置。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
C# 9.0 給 Unity 程式設計上帶來的便利
Thumbnail
C# 9.0 給 Unity 程式設計上帶來的便利
Thumbnail
這篇文章將會講述使用 C# 的類( Class ) 來讓欄位模組(module)化。
Thumbnail
這篇文章將會講述使用 C# 的類( Class ) 來讓欄位模組(module)化。
Thumbnail
介紹 在程式中你看到上面有一個中括號[] 就是特性,它自身沒有任何功能。 📷 特性attribute,和注釋有什麼區別 第一個感受 特性:中括號宣告 錯覺:每一個特性都可以帶來對應的功能 實際上添加後,編譯器會在元素內部產生IL,但是我們是沒辦法直接使用的,而且在metadata會有紀錄 📷
Thumbnail
介紹 在程式中你看到上面有一個中括號[] 就是特性,它自身沒有任何功能。 📷 特性attribute,和注釋有什麼區別 第一個感受 特性:中括號宣告 錯覺:每一個特性都可以帶來對應的功能 實際上添加後,編譯器會在元素內部產生IL,但是我們是沒辦法直接使用的,而且在metadata會有紀錄 📷
Thumbnail
這一篇文章將會從Microsoft的.NET Class Library開始介紹,在介紹具狀態和不具狀態,以及物件和new關鍵字。
Thumbnail
這一篇文章將會從Microsoft的.NET Class Library開始介紹,在介紹具狀態和不具狀態,以及物件和new關鍵字。
Thumbnail
本篇文章將會介紹C#的基礎構成和字串的使用,若想要更詳細的教學,可以參考前一篇文章,前往Microsoft官方教學學習。
Thumbnail
本篇文章將會介紹C#的基礎構成和字串的使用,若想要更詳細的教學,可以參考前一篇文章,前往Microsoft官方教學學習。
Thumbnail
本文章將會介紹結構(Struct)的定義、簡單介紹其應用,並且補充與序列化(SerializeFile)結合的方式。
Thumbnail
本文章將會介紹結構(Struct)的定義、簡單介紹其應用,並且補充與序列化(SerializeFile)結合的方式。
Thumbnail
這篇文章主要介紹存取子讀(get)和寫(set)的概述,並且簡單介紹基本的使用方法以及其他程式呼叫範例。
Thumbnail
這篇文章主要介紹存取子讀(get)和寫(set)的概述,並且簡單介紹基本的使用方法以及其他程式呼叫範例。
Thumbnail
本文以實際的程式碼來說明Value Type和Reference Type的差異,並介紹實用的除錯工具。
Thumbnail
本文以實際的程式碼來說明Value Type和Reference Type的差異,並介紹實用的除錯工具。
Thumbnail
撰寫程式時,有沒有想過宣告的這些變數是怎麼運作的呢? 本文介紹了Value Type跟Reference Type,以及Variable的基本命名方式。
Thumbnail
撰寫程式時,有沒有想過宣告的這些變數是怎麼運作的呢? 本文介紹了Value Type跟Reference Type,以及Variable的基本命名方式。
Thumbnail
撰寫程式,如何命名很重要,本文舉例了兩種廣泛使用的命名法則,同時收錄了好程式的判斷依據和減少資源浪費的撰寫方式。
Thumbnail
撰寫程式,如何命名很重要,本文舉例了兩種廣泛使用的命名法則,同時收錄了好程式的判斷依據和減少資源浪費的撰寫方式。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News