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

更新於 2024/09/09閱讀時間約 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
3會員
3內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Pluto Liu的沙龍 的其他內容
這是十二年前的事了,某一天許久沒再連絡的客戶來電告訴我系統Log出現一些異常記錄,並且有些圖檔沒有產出。我聽了覺得奇怪,系統在三年前最後一次更新後也没聽客戶說過有什麼奇奇怪怪的狀況發生,而且三年也早已過了保固期。 隨然已無合約上的關係,我還是很好奇這件事隔天就去看看到底發生了什麼事?没看没事,看了
程式寫久了對執行流程會總有些自以為是的邏輯,而這些自己為是的可能讓你產生難以找尋的Bug.比如說在任何地方return就是直接回到原呼叫端的流程,但是這個return在try block中可能不是想像中的那樣。 以下範例讓我們看看return之後程式跑到那去? // returnInTryBlo
這是十二年前的事了,某一天許久沒再連絡的客戶來電告訴我系統Log出現一些異常記錄,並且有些圖檔沒有產出。我聽了覺得奇怪,系統在三年前最後一次更新後也没聽客戶說過有什麼奇奇怪怪的狀況發生,而且三年也早已過了保固期。 隨然已無合約上的關係,我還是很好奇這件事隔天就去看看到底發生了什麼事?没看没事,看了
程式寫久了對執行流程會總有些自以為是的邏輯,而這些自己為是的可能讓你產生難以找尋的Bug.比如說在任何地方return就是直接回到原呼叫端的流程,但是這個return在try block中可能不是想像中的那樣。 以下範例讓我們看看return之後程式跑到那去? // returnInTryBlo
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
1227年秋,一代天驕成吉思汗死於六盤山附近的清水縣。 蒙古人舉行了一個很特殊的葬禮,埋葬了這個世界歷史上特殊的人物。他沒有留下陵寢和寶鼎,只在他墳地周圍30里處插上一圈箭簇,派重兵守衛這塊大禁地。由於時間已經過去了七百餘年,成陵的所在已經成為一個難解之謎。
Thumbnail
《金大班的最後一夜》講述上海舞女金大班的故事,展現她在面對愛情和婚姻選擇時的掙扎與成長。透過她的經歷,揭示出人生中的選擇往往充滿困難與無奈,特別是在年輕時的無知與年長後的領悟之間形成的對比。這篇文章探討了婚姻的交易性與個人選擇的意義,引起讀者對人生價值與選擇的深思。
Thumbnail
本文深入探討程式設計中的迴圈概念,介紹三種常見的迴圈使用方式:for、while 和 do...while。透過實例如計算 1 到 100 的總和以及九九乘法表,讓讀者能夠理解這些迴圈的應用場景及其運作邏輯。文章強調掌握迴圈及函數的重要性,並提供了避免常見錯誤的提示,非常適合初學者。
Thumbnail
C先生與老婆在經歷多年努力後,踏上了試管嬰兒的旅程。他們分享了自己面對無法懷孕的焦慮與壓力,並在黎惠波醫師的幫助下,透過努力終於迎來了新生命的希望。在這篇文章中,他們表達了對彼此的感激,尤其呼籲男性也應該關注自身健康,與伴侶共同走過這段艱辛的旅程,最終迎接了期待中的喜悅。
Thumbnail
為什麼從C開始? 為什麼不是python? 因為 C 是個「麻煩」的程式語言,而python 其實已經簡化很多步驟。先學C語言了解程式語言的架構,再學其他語言就會覺得更簡單! 我是搭配 CS50 的免費課程,看完影片還是不太懂,可以再搭配我的筆記複習。釐清基礎架構對電腦科學更有概念,可以更精準
Thumbnail
在 C# 的視窗應用程式開發中,有時候我們需要在子視窗中取得父視窗的參考,以實現不同視窗之間的資訊交換或操作。這篇教學將會示範如何使用 Owner 屬性來在子視窗中取得父視窗的參考,以及如何進行相關操作。
Thumbnail
條件句在編碼上隨處可見. 程式編碼就是一堆分別判斷情況, 再提出行動指令的邏輯. if為邏輯的根本. 就好像一個人去計劃做一件事或對一件事作預備, 不可能無假設, 沒有如果這字眼, 不用if這字眼, 就無法把情況判斷, 分類, 也無沒寫程式. 總而言之, 學條件句為最基本而必要. 其他相關:
Thumbnail
移除空白, 補上空白string字串 - Trim, TrimStart, TrimEnd, PadLeft, PadRight 轉換string字串成大小寫 插入, 移除, 取代 - Insert, Remove, Replace Source: https://jprogramstudy.com
Thumbnail
auto(自動)、register(暫存器)、static(靜態)、extern(外部),以作用範圍(scope)、存儲時期(life time)、連結(linkage)的不同作為區別。
Thumbnail
2004年聖彼得堡一家電影院的影廳裡頭擠滿了等著《The Lord of the Rings: The Two Towers 魔戒二部曲:雙城奇謀》放映的俄羅斯觀眾。這個場次的不尋常之處除了票價是平常電影票的好幾倍之外,銀幕上的電影似乎不盡然是我們看過《魔戒二部曲:雙城奇謀》......
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
1227年秋,一代天驕成吉思汗死於六盤山附近的清水縣。 蒙古人舉行了一個很特殊的葬禮,埋葬了這個世界歷史上特殊的人物。他沒有留下陵寢和寶鼎,只在他墳地周圍30里處插上一圈箭簇,派重兵守衛這塊大禁地。由於時間已經過去了七百餘年,成陵的所在已經成為一個難解之謎。
Thumbnail
《金大班的最後一夜》講述上海舞女金大班的故事,展現她在面對愛情和婚姻選擇時的掙扎與成長。透過她的經歷,揭示出人生中的選擇往往充滿困難與無奈,特別是在年輕時的無知與年長後的領悟之間形成的對比。這篇文章探討了婚姻的交易性與個人選擇的意義,引起讀者對人生價值與選擇的深思。
Thumbnail
本文深入探討程式設計中的迴圈概念,介紹三種常見的迴圈使用方式:for、while 和 do...while。透過實例如計算 1 到 100 的總和以及九九乘法表,讓讀者能夠理解這些迴圈的應用場景及其運作邏輯。文章強調掌握迴圈及函數的重要性,並提供了避免常見錯誤的提示,非常適合初學者。
Thumbnail
C先生與老婆在經歷多年努力後,踏上了試管嬰兒的旅程。他們分享了自己面對無法懷孕的焦慮與壓力,並在黎惠波醫師的幫助下,透過努力終於迎來了新生命的希望。在這篇文章中,他們表達了對彼此的感激,尤其呼籲男性也應該關注自身健康,與伴侶共同走過這段艱辛的旅程,最終迎接了期待中的喜悅。
Thumbnail
為什麼從C開始? 為什麼不是python? 因為 C 是個「麻煩」的程式語言,而python 其實已經簡化很多步驟。先學C語言了解程式語言的架構,再學其他語言就會覺得更簡單! 我是搭配 CS50 的免費課程,看完影片還是不太懂,可以再搭配我的筆記複習。釐清基礎架構對電腦科學更有概念,可以更精準
Thumbnail
在 C# 的視窗應用程式開發中,有時候我們需要在子視窗中取得父視窗的參考,以實現不同視窗之間的資訊交換或操作。這篇教學將會示範如何使用 Owner 屬性來在子視窗中取得父視窗的參考,以及如何進行相關操作。
Thumbnail
條件句在編碼上隨處可見. 程式編碼就是一堆分別判斷情況, 再提出行動指令的邏輯. if為邏輯的根本. 就好像一個人去計劃做一件事或對一件事作預備, 不可能無假設, 沒有如果這字眼, 不用if這字眼, 就無法把情況判斷, 分類, 也無沒寫程式. 總而言之, 學條件句為最基本而必要. 其他相關:
Thumbnail
移除空白, 補上空白string字串 - Trim, TrimStart, TrimEnd, PadLeft, PadRight 轉換string字串成大小寫 插入, 移除, 取代 - Insert, Remove, Replace Source: https://jprogramstudy.com
Thumbnail
auto(自動)、register(暫存器)、static(靜態)、extern(外部),以作用範圍(scope)、存儲時期(life time)、連結(linkage)的不同作為區別。
Thumbnail
2004年聖彼得堡一家電影院的影廳裡頭擠滿了等著《The Lord of the Rings: The Two Towers 魔戒二部曲:雙城奇謀》放映的俄羅斯觀眾。這個場次的不尋常之處除了票價是平常電影票的好幾倍之外,銀幕上的電影似乎不盡然是我們看過《魔戒二部曲:雙城奇謀》......