C# Nullable Reference Types - 永和的中和路還是中和的永和路

更新於 發佈於 閱讀時間約 3 分鐘

自從C#8.0開始,許多樣板的專案檔(.csproj)中多了以下這個設定<Nullable>enable</Nullable> ,它讓你coding開始進入twilightzone(陰陽魔界),對一切reference type 的寫法都不一樣了。reference type本來就是nullable啊!幹麻又要多弄一個nullable reference type?為什麼?

這一切歸咎於NullReferenceException這種低級的例外在runtime太多了,所以乾脆把這種可能性決戰於境外,在編譯時期就能糾出大部份這類的錯誤,況且強大的IDE(如visual studio)更能提早在編輯時警示你程式碼有這方面的問題。

為什麼NullReferenceException是一種低級的runtime exception?多年前一位剛畢業的工程師寫的一小段程式不能執行請我協助一下,結果有些的變數只有宣告而没有實例(instance)也就是說這些變數都是null,然後調用這些變數的方法那當然會在runtime時出現NullReferenceException。當程式中藏了這一類的雷,可能某個意想不到的時間點執行到,那真的得不償失,所以nullable reference type是個好東西。

一開始我對專案檔的這一段<Nullable>enable</Nullable>理解力不足,對這個機制一直不適應,reference type就已經是nullable了啊,你再enable還是nullable啊,後來發現C# in a Nutshell這本書對Nullable Reference Types寫到

Whereas nullable value types bring nullability to value types, nullable reference type do the opposite. When enabled, they bring non-nullability to reference type, with the purpose of helping to prevent NullReferenceExceptions.

跟我想的完全相反,所以那個enable是讓整個專案中的reference type 變為non-nullability,也就是那個enable把reference type變成跟value type樣都是不可為null的,所以這時侯就對所有的型別巧妙的達成了一致性,無論是value type 或是 reference type都一致成為non-nullability.

所以接下來你只像以前對value type宣告為nullable一樣的方式(在型別名稱後加問號),reference type就會變成 nullable reference type了

string? s=null;     //s is nullable reference type
留言
avatar-img
留言分享你的想法!
avatar-img
Pluto Liu的沙龍
3會員
3內容數
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
內容涵蓋資料型別、型別轉換、自訂型別、元組型別、集合型別和字典型別等主題。文章首先詳述內建型別如bool、byte、char等的定義和使用,接著討論型別轉換,包括隱含轉換和明確轉換。之後文章介紹自訂型別的建立,以及元組、集合、陣列和字典型別的操作與例子。
Thumbnail
內容涵蓋資料型別、型別轉換、自訂型別、元組型別、集合型別和字典型別等主題。文章首先詳述內建型別如bool、byte、char等的定義和使用,接著討論型別轉換,包括隱含轉換和明確轉換。之後文章介紹自訂型別的建立,以及元組、集合、陣列和字典型別的操作與例子。
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
空值例外是開發中一個常見的風險,特別是在 Kotlin 和 Java 這樣的跨平台開發中更容易出現。藉由合理地運用 Kotlin 的空值安全機制以及對 Java 程式碼的註解,可以有效地降低程式錯誤的風險,提高程式碼的可靠性和穩定性。
Thumbnail
空值例外是開發中一個常見的風險,特別是在 Kotlin 和 Java 這樣的跨平台開發中更容易出現。藉由合理地運用 Kotlin 的空值安全機制以及對 Java 程式碼的註解,可以有效地降低程式錯誤的風險,提高程式碼的可靠性和穩定性。
Thumbnail
在 kotlin 程式語言中,定義資料類型,最後加上問號「?」,則表示此筆資料可為空,可以指定 null 值。
Thumbnail
在 kotlin 程式語言中,定義資料類型,最後加上問號「?」,則表示此筆資料可為空,可以指定 null 值。
Thumbnail
在軟體開發中,處理nil或空值是一個常見的挑戰。不妥當地處理它們可能導致錯誤,使得程式碼的健壯性下降。但有沒有一種方法,可以讓我們在不做特殊檢查的情況下,優雅地處理這些空值呢?答案是肯定的,那就是空物件模式 (Null Object Pattern)!
Thumbnail
在軟體開發中,處理nil或空值是一個常見的挑戰。不妥當地處理它們可能導致錯誤,使得程式碼的健壯性下降。但有沒有一種方法,可以讓我們在不做特殊檢查的情況下,優雅地處理這些空值呢?答案是肯定的,那就是空物件模式 (Null Object Pattern)!
Thumbnail
C# 9.0 給 Unity 程式設計上帶來的便利
Thumbnail
C# 9.0 給 Unity 程式設計上帶來的便利
Thumbnail
介紹 在程式中你看到上面有一個中括號[] 就是特性,它自身沒有任何功能。 📷 特性attribute,和注釋有什麼區別 第一個感受 特性:中括號宣告 錯覺:每一個特性都可以帶來對應的功能 實際上添加後,編譯器會在元素內部產生IL,但是我們是沒辦法直接使用的,而且在metadata會有紀錄 📷
Thumbnail
介紹 在程式中你看到上面有一個中括號[] 就是特性,它自身沒有任何功能。 📷 特性attribute,和注釋有什麼區別 第一個感受 特性:中括號宣告 錯覺:每一個特性都可以帶來對應的功能 實際上添加後,編譯器會在元素內部產生IL,但是我們是沒辦法直接使用的,而且在metadata會有紀錄 📷
Thumbnail
本篇文章將會介紹C#的基礎構成和字串的使用,若想要更詳細的教學,可以參考前一篇文章,前往Microsoft官方教學學習。
Thumbnail
本篇文章將會介紹C#的基礎構成和字串的使用,若想要更詳細的教學,可以參考前一篇文章,前往Microsoft官方教學學習。
Thumbnail
本文以實際的程式碼來說明Value Type和Reference Type的差異,並介紹實用的除錯工具。
Thumbnail
本文以實際的程式碼來說明Value Type和Reference Type的差異,並介紹實用的除錯工具。
Thumbnail
撰寫程式時,有沒有想過宣告的這些變數是怎麼運作的呢? 本文介紹了Value Type跟Reference Type,以及Variable的基本命名方式。
Thumbnail
撰寫程式時,有沒有想過宣告的這些變數是怎麼運作的呢? 本文介紹了Value Type跟Reference Type,以及Variable的基本命名方式。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News