91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C# 7.2和8.0有哪些功能

發布時間:2021-11-24 13:48:00 來源:億速云 閱讀:173 作者:iii 欄目:大數據

本篇內容介紹了“C# 7.2和8.0有哪些功能”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

只讀引用和只讀結構體 [7.2原型]

首先提到的是只讀引用和結構體。簡單來講,這項特性使得C#能夠使用類似const的參數來提高性能。像我們所知道的“ref只讀參數”和簡單的“in參數”,這些特性使得大的結構體能夠通過引用來進行傳遞,并且不允許對其進行修改。

這個提案中的一部分就是只讀結構體。開發人員將一個結構體標記為只讀之后,表示任何方法都不能對這個結構體進行修改。這會對性能有很大提升,因為它會告訴編譯器,它可以跳過通常用于防止意外修改只讀變量的復制操作。

Blittable類型 [7.2提案]

維基百科上是這樣描述blittable類型的:

在微軟的.NET框架中,數據在托管代碼和非托管代碼中的內存表示是截然不同的。然而,blittable類型被定義為在這兩種不同的環境下,數據在內存中的表示是完全相同的,并且可以直接共享。

Non-blittable類型包括Boolean、string、char以及所有的引用類型。如果一個結構體包含了其中的一種類型,那么這個結構體本身也是non-blittable的。

目前,C#編譯器通過檢查一個類型的結構來推斷它是否是blittable的。這在過去引發了一些問題,因為有時增加一個新的字段會使得一個blittable類型變成non-blittable,然而在某些情況下,這種變化是致命的。

在Blittable類型提案中提到,使用關鍵字“blittable”能夠明確地將一個結構體定義為blittable的。如果之后它的類型被修改為non-blittable的,編譯器就會報錯。

為了保證長期的向后兼容性,被定義為blittable的結構中只能包含同樣明確定義為blittable的結構。此外,結構中不能使用StructLayout(LayoutKind.Auto)]。它表示的是結構體在物理內存中的排列方式。Explicit layout和sequential layout都是可以使用的。

注意:能夠修改一個結構體的LayoutKind或者Pack被認為是一個突破性的改進,因為它改善了非托管代碼訪問結構體的方式。

Microsoft擔心這個特性的過渡期。低層的類庫必須采用明確的blittable類型,更高層的類庫才能使用它們。

ref-like類型編譯期安全增強 [7.2提案]

這個特性也叫做“interior pointer”或者“類ref類型(ref-like types)”。該提案允許編譯器要求只能有特定的類型出現在棧上,比如Span<T>。其中列舉了如下幾個原因:

  1. Span<T>在語義上表示的是一個包含了一個引用和一個范圍的結構體(ref T data, int length)。不管它的實現是怎樣的,對這種類型的結構體的寫入操作并不是原子的。并發地對這個結構進行“撕裂(tearing)”可能會導致它的長度和數據不匹配,有可能會引起超出訪問范圍(out-of-range)和類型不安全,這最終可能會導致GC時的堆崩潰,盡管代碼看起來似乎是“安全”的。

  2. 在一些Span<T>的實現中,它的字段中會包含一個托管指針(managed pointer)。托管指針不支持堆對象的字段,并且將托管指針指向放在GC堆上的代碼會在JIT(Just-in-time)期間崩潰。

  3. Span<T>允許引用局部堆棧幀中的數據:單獨的局部變量或者棧上分配的數組。當Span<T>的實例的生命周期超過了引用的數據時,這會導致未定義的行為,包括類型安全違規和堆崩潰。

ref-like類型有如下幾種使用限制:

  • ref-like類型不能作為數組的元素

  • ref-like類型不能用作泛型類型參數

  • ref-like變量不能被裝箱

  • ref-like類型不能作為普通的非ref-like類型的字段

  • 一些間接限制,例如不允許在異步方法中使用ref-like類型,異步方法不支持ref-like類型字段

事實上,這意味著ref-like類型僅能被用作參數、局部變量以及某些情況下的返回值。ref-like類型能夠包含另一個ref-like類型。

所有的ref-like類型都是只讀結構體(詳見上方描述)。

像ref類型一樣,ref-like類型最終可能會成為“單賦值(single-assignment)”類型。該提案也提到了其他保障安全的方法,但是這個方法對編譯器的負擔是最小的。

C# 8.0原型

C# 8的兩個新特性已經到達了原型階段:

  • 可空引用類型(Nullable Reference Types):這個特性使得所有的引用類型在默認情況下都是不可空(non-nullable)的。如果能夠使用非空類型,你還會使用T(模板)嗎?就像你會使用可空結構一樣。

  • 默認接口方法(Default Interface Methods):這個特性使得C#引入了有限形式的多重繼承。

“C# 7.2和8.0有哪些功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

怀宁县| 兴安县| 深泽县| 涟源市| 大冶市| 塔城市| 周口市| 来宾市| 拉萨市| 苍溪县| 岳池县| 湖北省| 桐庐县| 神木县| 监利县| 大宁县| 泾源县| 湘乡市| 壶关县| 加查县| 廊坊市| 枣庄市| 临夏县| 绍兴市| 施甸县| 黑龙江省| 邢台市| 阜阳市| 彭阳县| 化德县| 龙州县| 米脂县| 太原市| 阿鲁科尔沁旗| 芦山县| 伊金霍洛旗| 饶阳县| 蓝田县| 长武县| 宁乡县| 依安县|