自從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