善用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
留言分享你的想法!
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
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
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)的概述,並且簡單介紹基本的使用方法以及其他程式呼叫範例。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News