關于是否在C#中加入不可空引用類型的爭論

來自微軟的Mads Togersen在近期所提出的一條提議,即在C#語言中加入對不可空引用類型的支持在.NET社區中引起了熱烈的爭論。人們對此提議的反應大相徑庭,既有人對此表示贊賞,也不乏傾向于保持現狀的意見。

\\

在Reddit上,這條提議引起了大量關于向后兼容性方面的疑問。Strilanc認為,如果應用了這一特性,按照這條提議的做法無法實現現有應用的平滑過渡:

\\
\

這條提議還有待改進,它對于保證二進制兼容性、源代碼兼容性以及現有代碼的漸進式過渡方面還存在著一些考慮不周的情況。

\\
  1. 該提議造成了程序集級別上的意義轉變,每個引用類型的名稱意義都將變為不可空。它將一次性讓整個項目級別的代碼塊的意義發生巨大的改變,要順利地完成這一過程,需要付出大量的成本并承擔極高的風險。這一點非常糟糕。 \\
  2. 該提議在泛型方面還有待改善,它完全沒有提及在大量的泛型代碼中將不允許使用default(T)這一事實。這一點對于現有的代碼將產生怎樣的影響?可以采取哪些解決手段?那些確實需要這一功能的類型又將如何實現default(T)的效果?這些問題都還沒有進行充分的探索。 \\
  3. 這種方式豈不是會允許數組包含一些無效的初始值嗎?這種做法公然地違反了類型系統的意義,既然如此,何必還要將它硬塞進去呢?\
\\

還有一方面的顧慮在于對于外部類庫的向后兼容性,正如Maplemario所說:

\\
\

那么問題來了。假設我要使用一個舊的類庫,其中的函數都返回類型T,無法它是否是可空的。現在,該提議產生了語言范式上的轉變,它將T視為不可空的T類型,而我所調用的某個函數卻有可能返回null(在編寫這個類庫時,這種做法是合法的)。如果這種場景在整個程序中是一個偶爾才需要進行測試的用例,那么在理想的情況下,項目文檔將指出這一點,而我在閱讀文檔后就知道應當在調用時進行空檢查。或者因為我記得這是一段陳舊的代碼,因此我將始終進行空檢查。而在實際情況下,由于“T即代表著不可空的T”,因此我無需再進行空檢查。如此一來,這段程序就會在我對空指針進行取值時崩潰。

\
\\

人們也在熱烈地討論這一提議的替代方案。用戶00Davo傾向于使用一種新的符號,以表示不可空類型。

\\
\

我也樂于讓純粹的T類型總是代表不可空的引用,而只有T?才能夠接受空值,但這種改變對于向后兼容性來說就是一場惡夢。如果能引入一個全新的、明確的不可空引用符號,那么向后兼容性就會堅挺許多。比如使用T!符號,如何?

\
\\

而在有些人看來,實現這一提議會造成的問題過多了。Number127建議將靜態分析作為一種替代方案:

\\
\

遺憾的是,目前來看,如果要以一種優雅的方法引入不可空引用類型,會造成過多的兼容性問題。我認為最有希望的替代方案是在維持目前的類型系統的情況下,通過靜態分析技術以檢查某個引用是否能夠保證不為空。

\
\\

在GitHub的頁面上,人們同樣在討論靜態分析這一方案。Paulo Morgado對此進行了更進一步的闡述,他表示這條提議其實就代表了靜態分析的使用:

\\
\

如果我的理解沒錯,這條提議其實就是一種增強版的方法契約而已。編譯器在這里不會做出什么擔保,更不用說運行時了。編譯器所做的無非是對于那些聲明為可空的變量進行數據流的分析而已。

\
\\

在另一個話題中,Tomas Petricek指出:這條提議必須考慮到其它CLR語言,例如F#:

\\
\

該提議能否詳細地說明一下如何在CLR級別保存可空的標注信息?(我猜測這些標注應當并不具有運行時的意義,它們只會表現為某種.NET\
attribute,或某種其它類型的元數據?)

\\

我希望未來某個版本的F#編譯器能夠辨識并理解這些標注信息,并定義某種“嚴格”模式,可空的類型在這種模式中將自動地暴露為option\u0026lt;'T\u0026gt;\
(或者差不多意思的某種類型)。

\
\\

對于不可空引用類型的爭論其實并不新鮮,在過去幾年中,對這一問題已經進行了多次討論。正如原微軟的首席開發者Eric Lippert所說,在一個已具有15年歷史的語言中添加不可空引用是一項浩大的工程。

\\

查看英文原文:Debate: Adding Non-nullable References to C#

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287394.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287394.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287394.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Andorid之提示java.lang.RuntimeException: Unable to start service net.gotev.uploadservice.UploadService@

1 問題 用android-upload-service上傳一個文件提示錯誤如下 04-15 17:46:33.245 24932 24932 E AndroidRuntime: Process: com.appsinnova.android.keepshare, PID: 24932 04-15 17:46:33.245 24932 24932 E AndroidRuntime: java.lang.RuntimeException: Unable to start se…

使用 VS Code + Markdown 編寫 PDF 文檔

1背景介紹 作為一個技術人員,基本都需要編寫技術相關文檔,而且大部分技術人員都應該掌握 Markdown 這個技能,使用 Markdown 來編寫并生成 PDF 文檔將會是一個不錯的體驗,以下就介紹下如何使用 VS Code Markdown 來編寫 PDF…

《看聊天記錄都學不會C語言?太菜了吧》(6)編程很難嗎?差一點就學不會了呢!

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我,若你是真心學習可以送你書籍,指導你學習,給予你目標方向的學習路線,無套路,博客為證。 本系列文章將會以通俗易懂的對話方式進行教學,對話中將涵蓋…

【ArcGIS風暴】氣象臺站氣溫(降水)矢量數據插值成柵格氣溫(降水)空間數據

關于文本格式的氣象數據生成Shapefile矢量數據的過程,可以參照文章《ArcGIS 10.2導入Excel數據X、Y坐標(經緯度、平面坐標),生成Shapefile點數據圖層》。本文在前面生成的具有氣溫和降水屬性的氣象臺站矢量數據的基礎上,通過柵格插值,柵格裁剪等過程生成空間分布的氣溫和…

時間差幾天 php,計算和當前時間差多少天

我們有時在做網站時會碰到比較特別的需求,一條信息顯示是幾天和幾天后的或者一個月前的,上次做一個APP時就碰到了這周情況,留下當時用的代碼以便以后用時不需要東奔西走。PHP代碼:function calcTime($time){$now time(); //當前時…

Android studio之導入新庫提示Add library ‘Gradle*****@aar‘ to classpath

1 問題 as導入第三方庫在依賴的基類build.gradle里面添加如下 implementation com.truizlop.sectionedrecyclerview:library:1.2.0 提示錯誤如下 2 原因 implementation 單層引用,只引用當前aar包層, api 多層引用,引用當前aar包層&#…

Windows 查看端口占用

查看 Windows 端口占用情況 在 Windows 命令行窗口下執行一下命令 查看所有端口占用情況netstat -ano 查看特定端口的占用情況netstat -aon|findstr "8080" 查看PID對應的進程tasklist|findstr "2212" 實例 博主碰到的是8080端口被占用了,如下圖…

Android quot;QR二維碼掃描quot;

支持燈 掃描結果 支持 抄、分享、瀏覽打開(超鏈接) 自己主動保存掃描記錄 劃刪除 和源代碼 git: http://git.oschina.net/892642257/QRCode csdn(0分): http://download.csdn.net/detail/onlyonecoder/7713589 版權聲明:本文博主原創文章。博…

ASP.NET Core中的依賴注入(4): 構造函數的選擇與服務生命周期管理

ServiceProvider最終提供的服務實例都是根據對應的ServiceDescriptor創建的,對于一個具體的ServiceDescriptor對象來說,如果它的ImplementationInstance和ImplementationFactory屬性均為Null,那么ServiceProvider最終會利用其ImplementationT…

C# WPF布局控件LayoutControl介紹

Dev學習地址文檔地址 :https://docs.devexpress.com/wpf:https://docs.devexpress.com/WPF/7875/wpf-controlswinform:https://docs.devexpress.com/WindowsForms/7874/winforms-controlsasp.NET: https://docs.devexpress.com/AspNet/7873/a…

《看聊天記錄都學不會C語言?太菜了吧》(7)下一篇文章告訴你牛郎是誰

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我,若你是真心學習可以送你書籍,指導你學習,給予你目標方向的學習路線,無套路,博客為證。 本系列文章將會以通俗易懂的對話方式進行教學,對話中將涵蓋…

【遙感物候】30年物候始期空間分布特征(平均值)和變化趨勢分析(Slope 一元線性回歸分析)

問題分析:本文的數據為經過預處理和計算得到的30年(1983-2012年)物候參數始期遙感數據,共計30期影像,現在需要逐像元計算整個物候始期的空間分布特征(平均值)和變化趨勢分析(Slope 一元線性回歸分析)。最終的效果(左圖為分布特征,右圖為變化趨勢): 一、方法原理 …

Android之CheckBox進行代碼設置setChecked(true)會觸發setOnCheckedChangeListener事件

1 問題 我們對CheckBox設置了setOnCheckedChangeListener監聽,代碼里面對CheckBox單獨代碼進行設置勾選(setChecked(true))的時候,會觸發OnCheckedChangeListener事件 2 解決辦法 用buttonView.isPressed()解決,這樣就只有手動點擊CheckBox…

密碼技術

要理解SSL就必須理解密碼系統、消息摘要函數(單向或散列函數)和數字簽名,這些技術是許多文獻所討論的主題(比如[AC96),提供了保密性、完整性和認證的基礎。 密碼系統 假設Alice想給她的銀行發一個消息以劃轉資金,并希望這個消息是保密的&…

deb php7 fileinfo,linux安裝php7.2擴展fileinfo

最簡便的方法是使用pecl安裝php的擴展,方便快捷,這里使用的是源碼編譯安裝php擴展項目 中上傳圖片遇到的問題:明顯是fileinfo不被支持,沒有安裝fileinfo。接下來開始安裝因為我的linux服務器里比較干凈,所以之前的php源…

Android之提示java.lang.RuntimeException: Parcel: unable to marshal value Image問題

1 問題 使用Intent攜帶數據(putExtra)跳轉activity,提示如下錯誤 04-18 22:42:49.664 16194 16194 E AndroidRuntime: Process: com.appsinnova.android.keepshare, PID: 16194 04-18 22:42:49.664 16194 16194 E AndroidRuntime: java.lang.RuntimeException: Parcel: unabl…

使用keepalived實現雙機熱備

2019獨角獸企業重金招聘Python工程師標準>>> 通常說的雙機熱備是指兩臺機器都在運行,但并不是兩臺機器都同時在提供服務。當提供服務的一臺出現故障的時候,另外一臺會馬上自動接管并且提供服務,而且切換的時間非常短。下面來以kee…

《看聊天記錄都學不會C語言?太菜了吧》(8)牛郎和織女竟有一個孩子?

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我,若你是真心學習可以送你書籍,指導你學習,給予你目標方向的學習路線,無套路,博客為證。 本系列文章將會以通俗易懂的對話方式進行教學,對話中將涵蓋…

技術貼:觸摸屏(TP)技術交流

轉載自:易觸網科技 電容式TP的動作原理 PS:電容式TP動作原理是利用人體電流感應來進行的,當人的手指觸摸在TP上,與Panle上的ito電路形成一個耦合電容(電容效應),於是手指從觸控點上吸走了一個微小的電流&am…

【遙感物候】植被物候與氣候(氣溫和降水)條件的空間相關性分析

植被生長與氣候的關系最為密切,通過計算植被各個生長季參數和氣溫、降水之間的相關系數可以分析生長季參數的變化與氣溫、降水之間的關系的程度。本文計算30年的植被物候參數和氣候數據之間的相關性,最終效果如下: 目錄 一、相關性分析原理