C# 8.0的三個令人興奮的新特性

来源:http://www.cnblogs.com/powertoolsteam/archive/2017/10/31/3-new-c-8-features.html
-Advertisement-
Play Games

C# 語言是在2000發佈的,至今已正式發佈了7個版本,每個版本都包含了許多令人興奮的新特性和功能更新。同時,C# 每個版本的發佈都與同時期的 Visual Studio 以及 .NET 運行時版本高度耦合,這也有助於開發者更好的學習掌握 C#,並將其與 Visual Studio 以及 .NET ... ...


C# 語言是在2000發佈的,至今已正式發佈了7個版本,每個版本都包含了許多令人興奮的新特性和功能更新。同時,C# 每個版本的發佈都與同時期的 Visual Studio 以及 .NET 運行時版本高度耦合,這也有助於開發者更好的學習掌握 C#,並將其與 Visual Studio 以及 .NET 的使用結合起來。

 

加快 C# 版本的發佈速度

在被稱為“新微軟”的推動下,微軟創新的步伐也加快了。為了做到加快步伐,微軟開發部門將一些過去集成在一起的技術現在都分離了出來。

Visual Studio、.NET Framework、.NET 運行時、編譯器和編譯運行時的運行語言都被拆分成自己的包和版本,這意味著以上每一個都可以按照自己的節奏發佈了。現在,我們已經看到了這種模式的成功。.NET Core 2.0 的工作已經完成了,並從 Visual Studio 發佈出來,同時也增加了對 Linux 的支持。幾乎與 .NET Core 2 發佈的同時,C# 7.1 版本也發佈了。

C# 7.1 是一個重要的發佈版本,雖然新功能不多,但它卻是 C# 第7個大版本的開始。C# 7.2 版本的工作已經展開了,同時也在計划著 C# 7.3 版本。儘管 C# 8.0 版本還有點遠,但是微軟技術人員已經對 C# 8.0 版本的特性有了一些想法。

語言設計的討論是公開的,圍繞 C# 8.0 版本新特性的問題部分也進行了廣泛的討論。檢查每個發行版本的里程碑,同時也為未來的 C# 路線圖做好評估。

下麵正式開始介紹 C# 8.0 版本中令人興奮的三個新特性。

 

非空和可空的引用類型

C# 有兩大變數類型:基本類型和引用類型。原先的類型是 int、char 和 double。這些類型都不能接受 null 值。在不分配新值的情況下,創建一個新的 int 值,會導致 int 值為 0 而不是 null。C# 2.0 介紹了帶有“?”符號的變數原語的可空版本。因此,int?是 int 的一個版本,它可以接受空值。

另一方面,引用類型(如字元串這樣的對象)始終能夠接受 null 值,並將 null 作為預設值。這也帶了來一個缺點,就是可能導致應用程式中帶入空引用。

在 C# 8.0 中,將引用類型設為非空,成為了一個可選的特性。

為 C# 引入這樣的特性是很困難的,因為這為原本已經運行很好的代碼,引入了潛在的編譯錯誤。因此需要做的是,創建此功能的方法,而不是為開發人員帶來無法估量的工作量。

根據設計方案,C# 團隊決定採取一個允許開發者可以選擇可空引用類型的方法。這將是一個工程級別的設定,以便啟用對可空引用的驗證。一旦啟用,可接受 null 值的對象就需要使用?運算符進行聲明。

如下代碼:

String s = null;
Console.Write(s);

這將引起警告,因為字元串不能接受空值。因此需要以下代碼:

String? s = null;
Console.Write(s);

然而,上面代碼也會在Console拋出一個警告,寫的是不希望收到一個空字元串。事實上,原始代碼可能有錯誤,所以級聯警告可以幫助我們避免運行時錯誤。這是最有可能提高代碼質量的語言變化。

 

新的輕量級類:Records

C# 8.0 的一個很棒的新特性,是有一種新方式來創建一個被稱為 records 的類。這個類本質上是一個非常輕量級的類,是一個欄位集合,能夠幫助快速創建 POCO 類型的對象,同時也可以解決比較對象是否相等時的關鍵問題。

例如,為銀行帳戶創建 record 類型:

class BankAccount(Guid Id, string Name, decimal Balance)

這是一種創建簡單類的很好的方法。

用 records 解決對象相等問題

在 C# 編程中,一個最難掌握的內容就是,將==運算符用於引用類型和原語之間的區別。

為了舉例說明,我們使用==對比兩個整數:

int I = 1;
int j = 1;
i == j //yields true

原語的值是相等的。但是,對於引用類型,卻不相等。

Object I = new Object();
Object j = new Object();
i == j //yields false

這是因為 C# 的引用類型比較會考慮引用相等,也就是說,只有當兩個對象是同一個對象才相等。records 類型提供了結構上的相等,等同於相等運算符。創建新 record 的語法非常簡潔,因為生成的對象是簡單的數據傳輸對象。

Records 是一個輕量級對象,使用起來非常方便。雖然 Records 不是語言的一個突破性的變化,但也是一個漸進的改進,值得歡迎。

 

預設介面實現

版本控制介面可能會令人懊惱, 因為它要求介面上的新方法來實現介面上的所有對象。隨著新方法添加到了介面中,實現它們的任務就落在了實現介面的各個類中。因為各個實現不必須共有同一個父類,添加到介面的方法就可以在各自的類中實現。

預設介面實現允許在介面中指定一個實現,只要它是介面上現有方法的函數實現的。下麵再以銀行帳戶為例:

public interface IBankAccountManager{
    void PerformTransaction(decimal amount, string reason);
}

現在為了便於使用,我們想在銀行賬戶上提供明確的借方和信譽功能。通常我們會為介面添加這些功能併在所有的類中實現它們。

public interface IBankAccountManager{
    void PerformTransaction(decimal amount, string reason); 
    void PerformDebit(decimal amount, string reason){ 
        PerformTransaction(-1 * amount, $”Debit: {reason}”); 
    } 
 
    void PerformCredit(decimal amount, string reason){ 
        PerformTransaction(amount, $”Credit: {reason}”); 
    } 
}

預設介面實現提供了一種強大的新方法來擴展實現介面的類,而無需重覆代碼。只需遵從預設實現,許多介面的類的實現就可以得到大大簡化。

 

其它的 C# 8.0 新特性

正是因為這些新特性,才讓我們毫不懷疑這就是 C# 8.0。以下是其它一些 C# 8.0 新特性:

  • 提升擴展支持 – 這種提升不僅僅可以用於擴展方法,它還提供了對屬性、靜態方法和更多方面的支持。
  • 非同步數據流 – 能夠擁有支持非同步操作的枚舉值。包括新的 iasyncenumerable <T> 和 iasyncenumerator <T> 介面。
  • Async Disposable – iasyncdisposable 允許對象有一個非同步的處理方法。

 

結論

過去幾年中,.NET 的創新速度確實加快了。雖然 C# 8.0 目前還沒有實現,但是它比起 C# 7.0,將帶來很多有幫助的提升,讓我們一起期待 C# 8.0 的早日到來。

原文鏈接:https://dzone.com/articles/3-new-c-8-features-we-are-excited-about

轉載請註明出自:葡萄城控制項

 

相關閱讀:

【報表福利大放送】100餘套報表模板免費下載

為什麼你需要將代碼遷移到ASP.NET Core 2.0?

是什麼優化讓 .NET Core 性能飆升?

C#開發人員應該知道的13件事

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 利用split 和遞歸做的 感覺還行:) 返回值是匹配程度全。 ...
  • 想在網頁上,顯示當前系統時鐘。 <body ng-app="App2" ng-controller="Ctrl2"> <div ng-bind="ShowTime"> </div> </body> angularjs程式: var app = angular.module('App2', []); ...
  • 1 //定義類 2 public class MyClass 3 { 4 public int Property1 { get; set; } 5 } 6 static void Main() 7 { 8 MyClass tmp_Class = new MyClass(); 9 tmp_Class.... ...
  • 今天練習angularjs的ng-change事件。 比如用戶作出選擇時,系統所指定的選項中,沒有用戶合適的選項。此時我們可以讓用戶填寫。 剛開始文本框是隱藏的。當用戶選擇了checkbox之後才會顯示出來。 在angularjs程式的model中IsVisible的值為false。 這樣子,程式在 ...
  • 1,同步電腦時間和北京時間 2,設置path地址為需要搶券的地址和搶券時間 搶券地址--> 搶券地址(註意不要漏掉http://或者https://) --> 搶券時間 時分 秒 3,點擊... ...
  • 之前 ,有想做一個文件管理頁面。 參考了 許多資料,終於完成了一個基於Asp.net MVC 的文件管理Demo.界面如下。 一,實現功能及相關技術 文件管理Demo基於Asp.NET MVC ,主要實現了 文件列表瀏覽,文件夾創建與刪除,文件夾以及文件重命名,文件與文件夾的複製、剪切、壓縮,文件與 ...
  • .net core已經發佈了2.0版本,相對於1.0的有了很大的完善,最近準備在項目中嘗試使用asp.net core,所以就進行了一些簡單的研究。 初識asp.net core分為以下幾個部分: 1、.net core SDK以及vs2017下載安裝 2、創建asp.net core項目 3、初識 ...
  • 1:做過圖像顯示的都知道,我們的圖片大部分都是壓縮過的,大部分為JPEG PNG BMP其中BMP格式是點陣形式,當圖片翻譯到記憶體之後無論壓沒壓縮過都會變成BMP格式放進記憶體,在這個過程中,圖片數據會幾倍的增大,就比如JPEG,一張1M大小的JPEG格式的圖片,翻譯到記憶體可能就會變成7倍左右,也就是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...