微軟提議在C 7中為引用增加選項型別

2021-09-16 18:17:29 字數 1496 閱讀 2267

微軟c#語言的專案經理mads torgersen,最近提議在c# 7中引入可為選項型別(option types)的引用型別。加入選項型別能讓c#語言變得更安全,正如torgersen所說,在c#裡,因為任一引用型別都能引用乙個空值,從而導致了空引用異常的氾濫成災,而使用選項型別能減少空引用異常的產生。

\u0026#xd;\n\u0026#xd;\n

c#已經對nullable值型別提供了支援,即對基於struct的已提供了支援,但不支援基於class的引用型別。對一門現存的已然成熟的程式語言事後加入選項型別,這其中存在著巨大的複雜性,出於這一原因,torgersen不打算建立一套「滴水不漏的」機制,而是在檢測到**可能存在解引用空值的時候發出警告資訊。

\u0026#xd;\n\u0026#xd;\n

新的提議方案對乙個現有的引用型別t有如下約定:

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\n

另一方面,當乙個非nullable陣列在進行初始化時,無法確保其中為null的陣列成員不被保留下來。

\u0026#xd;\n\u0026#xd;\n

使用空條件操作符(null-conditional operator)?.,可參考介紹c# 6,將產生以下效果:

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\nstring s;\u0026#xd;\nstring? ns = somestringmaybe();\u0026#xd;\n\u0026#xd;\ns = ns;                     // emits warning\u0026#xd;\nif (ns != null)  // ok\u0026#xd;\n\u0026#xd;\nwriteline(ns.length);       // emits warning\u0026#xd;\nwriteline(ns?.length);      // ok\u0026#xd;\n
\u0026#xd;\n\u0026#xd;\n

儘管使用這種新設計出的方法不用改動任何的現有**,但該方法仍可能對編譯器的行為產生潛在的影響,因為在當前的c#裡,t實際上用來表示乙個nullable型別。因此,torgersen說,需要另外再新增一套機制來關閉告警資訊,用於確保在跨c#版本和程式集下的編譯相容性。

\u0026#xd;\n\u0026#xd;\n

需要重點宣告的是,當所賦的值為null時,若編譯器只產生告警資訊,那麼c# 7仍將會允許乙個非nullable型別t包含null型別,這主要是出於對程式集相容性的考慮。這也使得c# 7表現得與其他程式語言大相徑庭,比如swift option types和haskell maybe,在swift和haskell中,選項型別可被視為對基本型別的一種封裝(實際上,在swift裡選項型別就是泛型型別,在haskell裡就是monad)。

\u0026#xd;\n\u0026#xd;\n

檢視英文原文:a proposal to add option types for references to c# 7

微軟在C 8中引入預覽版可空引用型別

微軟已經為開發者提供了預覽版的可空引用型別 nullable reference type 想嘗鮮的開發者可以嘗試這個新特性,並提供反饋。u0026 xd n u0026 xd n 預覽版可空引用型別是visual studio 2017 15.5 preview 4 的roslyn擴充套件,現在支...

微軟在C 8中引入預覽版可空引用型別

微軟已經為開發者提供了預覽版的可空引用型別 nullable reference type 想嘗鮮的開發者可以嘗試這個新特性,並提供反饋。預覽版可空引用型別是visual studio 2017 15.5 preview 4 的roslyn擴充套件,現在支援.net框架,很快也將支援.net cor...

微軟在C 8中引入預覽版可空引用型別

微軟已經為開發者提供了預覽版的可空引用型別 nullable reference type 想嘗鮮的開發者可以嘗試這個新特性,並提供反饋。預覽版可空引用型別是visual studio 2017 15.5 preview 4 的roslyn擴充套件,現在支援.net框架,很快也將支援.net cor...