微軟已經為開發者提供了預覽版的可空引用類型(Nullable Reference Type),想嘗鮮的開發者可以嘗試這個新特性,并提供反饋。
預覽版可空引用類型是Visual Studio 2017 15.5 Preview 4+的Roslyn擴展,現在支持.NET框架,很快也將支持.NET Core。該特性在C# 8中是默認啟用的。微軟為此提供了安裝指南。
在C# 8中引入新的可空引用類型是為了解決十億美元問題(Billion Dollar Mistake)。1965年,英國計算機科學家Tony Hoare在開發ALGOL時稱其為空引用(Null Reference)。指針最主要的問題是,有時候它們會為空,而這并非我們所期望的。在將空指針作為一種特性引入之后,反而變成產生bug的主要源頭。
早在2011年,用戶就在Visual Studio User Voice里要求“在C#中引入不可空引用類型”,一年之后,經過投票,該需求排到了第15位,現在已經跑到了第一的位置上。這個特性之所以在很長一段時間內都無法實現,是因為C#的空引用到處可見。C#首席設計師Mads Torgersen解釋說:
問題是空引用太有用了。在C#里,引用類型默認就是空值。還能用其他什么值來作為默認值嗎?在你知道該給一個變量賦什么值之前,拿什么作為它的默認值?一個新創建的引用數組又該使用怎樣的默認值?
有時候,空值本身也是有意義的。比如,有時候需要讓一個字段不包含任何值,或者將空值作為參數進行傳遞也是沒有問題的。但這些情況并不常見。這里還有另一個問題:像C#這樣的語言并沒有提供一種方式可以用于說明某處的空值是有意義的還是無意義的。
為了避免在C#中引入不可空引用類型,微軟將引用類型規定為默認不可空,并提供了一些機制用于處理可空類型。他們認為,大部分情況下引用類型都是非空或被間接引用的。Torgersen寫道:
我們相信,大部分情況下引用類型都不應該為空。可空引用類型是很罕見的(盡管很難說具體多罕見),所以需要單獨對它們進行注解。C#已經提供了可空的值類型(value type)。不應該讓你自己或其他人在空值這個問題上有太多負擔,除非你確定需要它們。空值應該是我們需要顯式去指定的。可空引用類型通過問號來定義,如下所示:
class Person { public string FirstName; // Not null public string? MiddleName; // May be null public string LastName; // Not null}微軟希望開發者試用這個新特性,并提供反饋。
更多的信息可參考 C# Futures: Nullable Reference Types、C# 8.0 Previewed、A Proposal for Non-Nullable Types in C#。
查看英文原文:Microsoft Previews Nullable Reference Types in C# 8