一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - 再來說說我喜歡的 Dotnet 5.0 & C# 9

再來說說我喜歡的 Dotnet 5.0 & C# 9

2021-09-29 23:16老王Plus老王Plus的老王 C#

語言方面,最主要的特性,是 Record。這是 C# 9 出來的一個新數據類型。沒錯,Record 是一個數據類型。

再來說說我喜歡的 Dotnet 5.0 & C# 9

C# 9,對應的是 Dotnet 5.0。

這個出來也有些日子了,不過好像群里很多人還是沒往這個版本走。

我這邊現在是全線已經轉向了 5.0,還是我經常說的那個原因:爽。Dotnet 的每一次升級,都有一些讓人驚喜的特性,讓代碼更合理,更節省時間。

1. 基礎語言方面

語言方面,最主要的特性,是 Record。這是 C# 9 出來的一個新數據類型。沒錯,Record 是一個數據類型。

這個 Record 提供了一些很爽的表示數據的內置功能,以至于使用的時候,感覺它更像一個類。

按微軟的說法,Record 的目的,是提供一個更小更簡單的類型來表示不可變數據。不過在使用中,我更喜歡用它來做數據傳輸。

定義一個 Record

定義一個 Record 有幾種方式。最簡單的形式是:

  1. public record User( string nameint age ); 

第一次看這個東西,會有點奇怪,有沒有?長得有點像方法,可就沒內容。

嗯,這確實是 Record 的一個聲明定義,定義了一個對象 user,這個對象 user 具有 name 和 age 兩個屬性。可以通過以下方式來訪問:

  1. var some_user = new User ( "WangPlus", 35 ); 
  2. Console.WriteLine( some_user.name );    //輸出 WangPlus 
  3. Console.WriteLine( some_user.age );        //輸出 35 

確實跟類有點像。

再來看看另一種定義方式,會更像一個類:

  1. public record User 
  2.   public string name { get; set; } 
  3.   public int age { get; set; } 

給 Record 賦值

既然長得像類,我們可以像類一樣去賦值:

  1. var some_user = new User { name = "WangPlus", age = 35 }; 

還可以用位置語法,近一步簡化:

  1. User some_user = new ( "WangPlus", 35 ); 

注意這個位置語法,其實就是按位置匹配字段的意思。賦值時的值,會自動去找對應位置的屬性來匹配和校驗。

而且,對于第一種簡單定義:

  1. public record User( string nameint age ); 

賦值語句實際編譯時,上面字段中的 set 會被替換為 init,即:

  1. public record User 
  2.   public string name { get; init; } 
  3.   public int age { get; init; } 

這意味著屬性在初始化后無法改變,會變成只讀屬性。

相等判斷

Record 對于相等的定義是內部的屬性相等。也就是說,判斷兩個 Record 是否相等時,將檢查每個屬性的值,而不是對象的引用地址。

看例子:

  1. User some_user1 = new ("WangPlus", 35); 
  2. User some_user2 = new ("WangPlus", 35); 
  3. Console.WriteLine(some_user1 == some_user2);    // true 
  4. Console.WriteLine(ReferenceEquals(some_user1, some_user2));    // false 

例子中,some_user1 和 some_user2 屬性相同,所以他們是相等的,盡管是兩個不同的引用。

不一樣的 ToString()

Record 的 ToString 是一個內置方法,跟別的對象的 ToString 有很大區別。它會把 Record 的定義、屬性和值全部輸出。上面的例子,輸出的內容將會是:

  1. User { name = WangPlus, age = 35 } 

注意:如果某個 Record 的屬性是引用類型,ToString 將會輸出這個類型的名稱。

Record 值的傳遞

這個內容延續到了 C# 10,相關內容我在 「Dotnet 6.0,你值得擁有」里有詳細的描述,可以去看看。

這里簡單說一下,就是使用 With:

  1. User some_user = new ( "WangPlus", 35 ); 
  2. User other_user = some_user with { name = "WangPlus1" }; 

定義 Init 屬性

C# 9 里,新增了一個對于屬性定義的 init 關鍵字。這個關鍵字可以用在 Struct、Class、Record 中,表示屬性僅在初始化時可以進行設置。

例如:

  1. public record User 
  2.   public string name { get; set; } 
  3.   public int age { get; init; } 

這里,age 屬性被定義為 init。賦值還是一樣的:

  1. User some_user = new ( "WangPlus", 35 ); 

當改變值時,例如:

  1. some_user.name = "WangPlus1"

這個是有效的,但是:

  1. some_user.age = 36; 

這句話會報錯,因為在上面定義中,age 被定義為 init,即只有初始化時可以賦值。

以上是 C# 9 中增加的最重要的一個內容:Record 類型。

2. API 方面

API 方面,主要是三個特性。

1). 頂級程序

這算是大家盼了很久的一個特性。

早期,一個程序的開始,會是這個樣子:

  1. using System; 
  2.  
  3. namespace Demo 
  4.     static class Program 
  5.     { 
  6.         static void Main(string[] args) 
  7.         { 
  8.             Console.WriteLine("Hello World!"); 
  9.         } 
  10.     } 

現在有了頂級程序的規則,這一大段,可以直接簡化為:

  1. System.Console.WriteLine("Hello World"); 

就OK了。Program 啦,Main 啦,統統都可以不寫了。

對于 WebAPI 應用也一樣:

  1. using Microsoft.AspNetCore.Hosting; 
  2. using Microsoft.Extensions.Hosting; 
  3.  
  4. namespace Demo 
  5.     public class Program 
  6.     { 
  7.         public static void Main(string[] args) 
  8.         { 
  9.             CreateHostBuilder(args).Build().Run(); 
  10.         } 
  11.  
  12.         public static IHostBuilder CreateHostBuilder(string[] args) => 
  13.             Host.CreateDefaultBuilder(args) 
  14.                 .ConfigureWebHostDefaults(webBuilder => 
  15.                 { 
  16.                     webBuilder.UseStartup<Startup>(); 
  17.                 }); 
  18.     } 

這是一個標準的 WebAPI 應用的開始。現在,也可以簡化成:

  1. using Microsoft.AspNetCore.Hosting; 
  2. using Microsoft.Extensions.Hosting; 
  3.  
  4. CreateHostBuilder(args).Build().Run(); 
  5.  
  6. IHostBuilder CreateHostBuilder(string[] args) => 
  7.     Host.CreateDefaultBuilder(args) 
  8.         .ConfigureWebHostDefaults(webBuilder => 
  9.         { 
  10.             webBuilder.UseStartup<Startup>(); 
  11.         }); 

這樣的代碼其實更簡潔,而且可以直觀的說明程序的意圖。如果你也經常寫 Python,那你會很喜歡這個特性。

2). 新的匹配模式

C# 9 里,終于加入了大家期盼已久的新的匹配模式。主要有兩類:

第一類:邏輯匹配

這個主要是加入了 And、Or 和 Not。

以前,我們會用到這樣的判斷:

  1. if( input == null ) {} 

有時候,我們也會寫成:

  1. if( input is null ) {} 

但是,判斷不等于時,我們只有一種方式,就是:

  1. if( input != null ) {} 

現在,我們有了更可讀的寫法:

  1. if( int is not null ) {} 

看起來可讀性就很高了。

第二類:關系匹配

這個特性,涉及的是 <、>、<=、>=,最主要的是改變了 Switch。

以前,使用 Switch 時,Case 必須是可枚舉的值,看例子:

  1. switch( input ) 
  2.   case 1: 
  3.     break; 
  4.   case 2: 
  5.     break; 
  6.   default
  7.     break; 

現在,這里面加入了范圍判斷,可以這么寫:

  1. switch( input ) 
  2.   case <5: 
  3.     break; 
  4.   case >=5 and <=9: 
  5.     break; 
  6.   default
  7.     break; 

看到沒?更多的邏輯可以在 Switch 里實現,而不用一大篇 if…else 了。

3). 類型省略

這個特性涉及到代碼的方方面面,主要的目的,是為了減少代碼的輸入量。

看個例子,以前我們定義一個字段,通常是這樣:

  1. public List users = new List(); 

現在,我們可以直接省略后面的部分,編譯器會很聰明的知道我們想 New 什么:

  1. public List<User> users = new (); 

方法也是一樣。假設我們有一個方法:

  1. public static class Users 
  2.   public User copyUser(User source) {} 

以前調用時,我們需要先給個變量,再調用方法:

  1. User source_user = new User(); 
  2. Users.copyUser( source_user ); 

現在,我們可以在方法中直接 New:

  1. Users.copyUser( new () ); 

當然,這個特性也結合了上面 Record 的特性。

因此,我們還可以這么寫:

  1. Users.copyUser( new () { name = "WangPlus" } ); 

嗯,語庋的改變需要一點時間來適應,但從長遠來看,依然是一種進步,會讓代碼更方便寫和讀。同時,這個特性,和 Var 會變成編程的兩個面,哪個更好用,看自己的習慣了。

3. 總結

總的來說,Dotnet 5.0 的變化還是有很多驚喜的。上面寫的,只是我們能比較容易感受到的部分,感受不到的部分,比方編譯的合理性、性能的優化,GC的回收,做得都相當優秀。

早轉 5.0 早好,對吧?

原文鏈接:https://mp.weixin.qq.com/s/RfYDOR407DUZp6SxE6BzIw

延伸 · 閱讀

精彩推薦
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
主站蜘蛛池模板: 乖女的嫩奶水h文孕妇 | 国产成人v爽在线免播放观看 | 亚洲午夜久久久 | 四虎影院免费在线播放 | uoco福利姬网站 | 欧洲美女人牲交一级毛片 | 男生操男生 | 久久九九有精品国产23百花影院 | 久久不卡免费视频 | 99久久精品免费看国产 | 国产三级精品久久三级国专区 | 无码11久岁箩筣 | 韩国三级理韩国三级理人伦 | 性色欲情网站IWWW九文堂 | 爱情岛论坛自拍永久入口 | 二次元美女挤奶漫画 | 高h全肉np触手 | 精品日本三级在线观看视频 | 白发在线视频播放观看免费 | 骚虎网站在线观看 | 国产黄频在线观看高清免费 | 亚洲va在线va天堂成人 | 亚洲系列国产系列 | 日韩国产成人资源精品视频 | 九九九国产在线 | 波多野结衣52部合集在线观看 | 欧美猛男同志同性video | 亚洲成a人不卡在线观看 | 色狠狠成人综合网 | 欧美a欧美1级 | 成年人视频在线免费看 | 麻麻与子乱肉小说怀孕 | 国产三及 | porno18hd老师| 视频在线欧美 | 日韩夫妻性生活 | 白丝尤物的下面被疯狂蹂躏 | 欧美日韩在线观看一区二区 | 日本三级斤 | 亚洲精品一二三四 | 国产久热香蕉在线观看 |