更新於 2024/09/09閱讀時間約 3 分鐘

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

自從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
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.