微軟在C# 8中引入預(yù)覽版可空引用類型

責任編輯:editor004

作者:Abel Avram

2017-11-20 11:20:53

摘自:INFOQ

微軟已經(jīng)為開發(fā)者提供了預(yù)覽版的可空引用類型(Nullable Reference Type),想嘗鮮的開發(fā)者可以嘗試這個新特性,并提供反饋。為了避免在C 中引入不可空引用類型,微軟將引用類型規(guī)定為默認不可空,并提供了一些機制用于處理可空類型。

微軟已經(jīng)為開發(fā)者提供了預(yù)覽版的可空引用類型(Nullable Reference Type),想嘗鮮的開發(fā)者可以嘗試這個新特性,并提供反饋。

預(yù)覽版可空引用類型是Visual Studio 2017 15.5 Preview 4+的Roslyn擴展,現(xiàn)在支持.NET框架,很快也將支持.NET Core。該特性在C# 8中是默認啟用的。微軟為此提供了安裝指南。

在C# 8中引入新的可空引用類型是為了解決十億美元問題(Billion Dollar Mistake)。1965年,英國計算機科學家Tony Hoare在開發(fā)ALGOL時稱其為空引用(Null Reference)。指針最主要的問題是,有時候它們會為空,而這并非我們所期望的。在將空指針作為一種特性引入之后,反而變成產(chǎn)生bug的主要源頭。

早在2011年,用戶就在Visual Studio User Voice里要求“在C#中引入不可空引用類型”,一年之后,經(jīng)過投票,該需求排到了第15位,現(xiàn)在已經(jīng)跑到了第一的位置上。這個特性之所以在很長一段時間內(nèi)都無法實現(xiàn),是因為C#的空引用到處可見。C#首席設(shè)計師Mads Torgersen解釋說:

問題是空引用太有用了。在C#里,引用類型默認就是空值。還能用其他什么值來作為默認值嗎?在你知道該給一個變量賦什么值之前,拿什么作為它的默認值?一個新創(chuàng)建的引用數(shù)組又該使用怎樣的默認值?

有時候,空值本身也是有意義的。比如,有時候需要讓一個字段不包含任何值,或者將空值作為參數(shù)進行傳遞也是沒有問題的。但這些情況并不常見。這里還有另一個問題:像C#這樣的語言并沒有提供一種方式可以用于說明某處的空值是有意義的還是無意義的。

為了避免在C#中引入不可空引用類型,微軟將引用類型規(guī)定為默認不可空,并提供了一些機制用于處理可空類型。他們認為,大部分情況下引用類型都是非空或被間接引用的。Torgersen寫道:

我們相信,大部分情況下引用類型都不應(yīng)該為空??煽找妙愋褪呛芎币姷模ūM管很難說具體多罕見),所以需要單獨對它們進行注解。C#已經(jīng)提供了可空的值類型(value type)。不應(yīng)該讓你自己或其他人在空值這個問題上有太多負擔,除非你確定需要它們??罩祽?yīng)該是我們需要顯式去指定的。

可空引用類型通過問號來定義,如下所示:

class Person { public string FirstName; // Not null public string? MiddleName; // May be null public string LastName; // Not null}

微軟希望開發(fā)者試用這個新特性,并提供反饋。

更多的信息可參考 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

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號-6京公網(wǎng)安備 11010502049343號