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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

展望C# 7

發布時間:2023/12/4 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 展望C# 7 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

譯者:雪落無痕 xdj

  目前的 C# 編譯器(即?Roslyn)于 2014 年 4 月開源。目前不僅是編譯器在 GitHub 上開發;語言的設計也是進行公開的討論。?這允許感興趣的各方了解語言下一個版本的樣子。這篇文章概述了當前在設計語言新特性時的思考過程。如果你對現在 Roslyn 生態系統的更廣泛的方面感興趣的話,可以閱讀 DotNetCurry(DNC)雜志 2016 年 3 月版上我的文章:?.NET 編譯器平臺(Roslyn)概述?。

  下一版?C#的主題

  截止目前,每個版本的C#(C# 6.0 可能除外)都會圍繞一個特定的主題:

  • C# 2.0 引入泛型。

  • C# 3.0 通過擴展方法、lambda 表達式、匿名類型和其他相關特性帶來了 LINQ。

  • C# 4.0 都是關于與動態非強類型語言的互操作。

  • C# 5.0 簡化異步編程和異步等待等關鍵詞。

  • C# 6.0 完全重寫,并且引入了各種各種更易實現的小特性和改進。你可以在 DotNetCurry(DNC)雜志 2016 年 1 月版上找到一篇C#6.0 特性的概述文章:U升級現有 C# 代碼到 C# 6.0。

  C# 7.0 可能不會有例外。語言設計者們目前專注于三個主題:

  • Web 服務的使用增長正在改變數據建模的方式。數據模型的定義正在成為服務契約的一部分,而不是在應用程序去完成。雖然這在函數式語言中是是非常方便的,但是它給面向對象開發帶來了額外的復雜度。幾個 C# 7 的特性正是以通過外部數據契約來簡化該工作為目標的。

  • 日益增長的移動設備共享使得性能成為一個重要的考量因素。C# 7.0 的計劃特性允許進行性能優化,以前這在 .Net 框架上是不可能的。

  • 可靠性和魯棒性是軟件開發中一個永恒的挑戰。C# 7.0 可能用一部分開發時間來應對這個挑戰。

  讓我們仔細看看每個主題的一些計劃中特性。

  處理數據

  面向對象語言比如 C# 在一組預定義的操作作用于一組可擴展的數據類型這樣的場景中工作的很好。這些通常是通過一個接口(或者一個基類)對可用操作進行建模,以不斷增加的子類表示數據類型。通過實現接口,類包含了各種操作的實現。

  比如,在一個游戲中,武器可能是各種不同類型(比如一把劍或者一張弓),并且操作可能也是不同的動作(比如攻擊或者修復),增加一個新的武器類型(比如一把光劍)會很簡單:創建一個新類,實現武器的接口。增加一個新動作(如轉動)另外一方面就需要擴展接口和修改已有的武器實現。這在 C# 中是很自然的。


  在函數式編程中,數據類型不包括操作。相反,每一個函數對所有數據類型實現一個單一的操作。?這使得增加新操作(只需要定義一個新函數)更容易,但是增加新數據類型(需要修改所有已有相應的函數)卻更難了。但是這在 C# 中是可能的了,它更加繁瑣一些。


  模式匹配是可以幫助簡化上述代碼的特性。讓我們來一步一步將它應用到 Attack 方法中:


  替代原有兩句分離的語句來檢查武器類型并將其賦值相應類型的變量,現在 is 操作符將允許我們聲明一個新變量并分類類型值。

  類似的結果,一個 switch case 語句可以替代 if。這使得代碼更加清晰,特別是有很多分支時:


  注意下 case 語句是如何同時做到類型轉換和條件檢查的,增加了代碼的簡潔性。

  另外一個模式匹配相關的特性是?switch 表達式。你可以認為它是一種 switch 語句,每個 case 分支都會返回一個值。使用這個特性,一個有限狀態機的轉換就可以定義在一個表達式中了。


  上面的代碼還使用了另外一個特性:?tuples。 它們被設計成更加輕量級的匿名類的替代品。他們主要被用在函數返回多個值時,替代 out 類型參數。

  更多函數式編程的開發方式會很快導致類只作為數據的容器,而不包含任何方法和業務邏輯。records?語法允許這種類的標準化實現,只需要最少的代碼:

public class Sword (int Damage, int Durability);

  這簡單的一行表示了一個完整的函數式類:

  正如你所看到的,這個類包含一些只讀的屬性,一個構造函數用來初始化這些屬性。它還實現了 equality 方法,并使用基于 hash 的集合正確的重載了 GetHashCode,?比如 Dictionary 和 Hashtable。你可能不認識最后兩個函數:

  • Is 操作符重載允許模式匹配時拆分成元組結構。

  • 為了解釋 With 方法,請讀下面幾段。

  Record 將支持繼承,但具體的語法還沒定。

  增加可靠性

  上面使用 record 語法生成的 Sword 類,是不可變類的一個例子。這表示它的狀態(屬性的值)在類的實例創建后不能被改變。

  如果你想知道它跟可靠性有什么關系,想想多線程編程吧。隨著處理器有更多核而不是更高時鐘頻率,在服務器、桌面和移動端,多線程編程只會變得更重要和更流行。同時不可變對象需要不同的編程方式,它在設計上就避免了多線程在沒有合適的同步情況下修改同一對象時產生的條件競爭(比如,沒有正確使用鎖或者其他線程同步原語)。

  盡管現在 C# 中創建不可變對象也是可以的,但是它太復雜了。下面介紹的C#7.0 中的特性使得它更便捷的定義和使用不可變對象:

  · 對象初始化器只作用于只讀屬性,自動回落到匹配的構造函數上:

IWeapon sword = new Sword { Damage = 5, Durability = 500 };

  · 特殊的語法將用于創建簡潔的對象副本:

IWeapon strongerSword = sword with { Damage = 8 };

  上面的表達式將創建一個 Sword 的副本對象,所有屬性有相同的值,除了 Damage 使用新提供的值。完成這個表達式的內部運作的細節仍在討論中。其中一個選項是需要的類有 With 方法,就像在 records 的例子中展示的那樣:

public Sword With (int Damage = this.Damage, int Durability = this.Durability) => new Sword (Damage, Durability);

  這將使?with 表達式語法自動轉換成下面的方法調用:

IWeapon strongerSword = sword.With (Damage: 8);

  C# 7 可靠性工作的第二部分是null 安全的主題。我們都同意 NullReferenceException 是最常見也最難以解決的失敗之一。任何可以減少此類異常的數量的語言的改進肯定會對整個應用程序的可靠性有積極的影響。

  第三方供應商,如 JetBrains 著名 Visual Studio 擴展 ReSharper 已經在這個方向上走出了第一步。他們的工作是基于代碼的靜態分析,開發人員試圖銷毀一個對象之前沒有檢查 null 值時,發出警告。這是通過 Attibute 來實現的,可以用來標注方法是否可以返回 null 值。他們也為 BCL (基類庫)類準備了標注。如果開發人員會正確地標注他/她所有的代碼,靜態分析應該能夠可靠地警告任何潛在的 NullReferenceException 來源。

  C#語言設計團隊正試圖實現相同的目標,只不過是在語言層面上。核心思想是允許變量類型定義中包含是否可以賦值為空的信息:

IWeapon? canBeNull; IWeapon cantBeNull;

  分配一個 null 值或潛在的 null 值給非空變量會導致編譯器的警告(開發人員可以配置在這些警告的情況下構建失敗,來增加額外的安全):

canBeNull = null; // no warningcantBeNull = null; // warningcantBeNull = canBeNull; // warning

  這種改變的問題是它破壞現有代碼:它假設以前代碼中所有變量都是非空的。為了應對這種情況,可以在項目級別禁用靜態分析。開發人員可以決定何時進行 nullability 檢查。

  在過去 C# 類似的改變已經被在考慮,但因為向后兼容性的問題沒能實現。因為?Roslyn?已經改變了什么編譯器和執行靜態分析的診斷能力,語言團隊決定再次重溫這個話題。讓我們保持祈禱,讓他們設法想出一個可行的解決方案。

  改進的性能

  C# 7.0 中性能改進重點是減少內存位置中的數據復制。

  局部函數將允許在其他函數內部嵌套聲明輔助函數。這不僅會縮小他們的作用域,也允許使用聲明涵蓋范圍內的變量,而且不會在堆上分配額外的內存和堆棧:


  返回值和局部變量的引用也能用來阻止不必要的數據拷貝,同時他們的行為也改變了。因為這些變量指向原本的內存地址,任何對此處值的改變都會影響到局部變量的值:

  在上面的例子中,terrainType 是一個局部變量的引用,GetAt 是一個返回值的引用的函數:

public ref TerrainType GetAt (int x, int y) => ref terrain[x, y];

  Slices?是提出的最后的性能相關的特性:

var array = new int[] { 1, 2, 3, 4, 5 };var slice = Array.Slice (array, 0, 3); // refers to 1, 2, 3 in the above array

  Slice(切片) 使得將一個數組的一部分可以作為一個新的數組進行處理,而實際指向原數組的同一內存地址。

圖1: Slices 是另一個數組的一部分

  同樣的,對任何一個數組的修改將會同時影響兩個數組,沒有任何值被拷貝。這將導致較大狀態的更有效的管理,比如在游戲中。所有需要的內存只需要在應用開始的時候分配一次,完全避免了新內存分配和垃圾收集。

  更進一步,它使我們可以用同樣的方式獲得一塊原生的內存塊,可以直接讀取和寫入,而不用再進行編組。

  嘗試實驗功能

  盡管所有上述的功能還遠沒有完成,任何工作已經可以在 GitHub 上使用。如果你有興趣試試,你完全可以這樣做。

  在撰寫本文時,最簡單的方式是安裝 Visual Studio “15”預覽版,從三月底起可以從此處下載。它包含新版的 C# 編譯器,帶有下列實驗功能等著你來試用:模式匹配,局部函數返回值和局部變量的引用

  尚未成熟的特性需要你基于 GitHub 源碼構建自己版本的編譯器,這超出了本文討論范圍。如果你感興趣,可以讀下這篇詳細指導的文章?。

  甚至在?Visual Studio “15”預覽版中,默認情況下新的實驗功能還是不能用的。

Image 2: Experimental features must be enabled explicitly

  盡管指示會有錯誤,在寫代碼時最簡單的方式來啟用這些功能的方法是在工程的編譯屬性里增加__DEMO__ 和?__DEMO_EXPERIMENTAL__條件編譯符號。

  圖3: 增加條件編譯符號

  現在你就可以使用任何支持的實驗語言特性了,編譯工程也不會有錯了。

  結論:

  所有本文描述的C# 7 新的語言功能都還在實現中。在C#7.0 的最終版本里,他們可能會很不一樣或者根本不存在。這篇文章只是一個 C# 語言的當前狀態的總覽,讓你能一窺未來,也許能引發你足夠的興趣去更緊密得跟蹤開發,或者在新功能未完成時就去嘗試下。通過在語言開發過程中作為一個更積極的部分,你就可以影響它,同時也能學到新東西;可能在下一版本可用之前就能改善你現有的編碼實踐。

原文地址:http://www.oschina.net/translate/csharp-7-new-expected-features


.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

總結

以上是生活随笔為你收集整理的展望C# 7的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。