日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

关于是否在C#中加入不可空引用类型的争论

發(fā)布時間:2023/12/9 C# 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于是否在C#中加入不可空引用类型的争论 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

\\

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

\\\

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

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

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

    \\\

    那么問題來了。假設(shè)我要使用一個舊的類庫,其中的函數(shù)都返回類型T,無法它是否是可空的?,F(xiàn)在,該提議產(chǎn)生了語言范式上的轉(zhuǎn)變,它將T視為不可空的T類型,而我所調(diào)用的某個函數(shù)卻有可能返回null(在編寫這個類庫時,這種做法是合法的)。如果這種場景在整個程序中是一個偶爾才需要進(jìn)行測試的用例,那么在理想的情況下,項目文檔將指出這一點(diǎn),而我在閱讀文檔后就知道應(yīng)當(dāng)在調(diào)用時進(jìn)行空檢查?;蛘咭驗槲矣浀眠@是一段陳舊的代碼,因此我將始終進(jìn)行空檢查。而在實際情況下,由于“T即代表著不可空的T”,因此我無需再進(jìn)行空檢查。如此一來,這段程序就會在我對空指針進(jìn)行取值時崩潰。

    \\\

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

    \\\

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

    \\\

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

    \\\

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

    \\\

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

    \\\

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

    \\\

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

    \\\

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

    \\

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

    \\\

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

    \\

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

    總結(jié)

    以上是生活随笔為你收集整理的关于是否在C#中加入不可空引用类型的争论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。