成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

再來(lái)說(shuō)說(shuō)我喜歡的 Dotnet 5.0 & C# 9

開(kāi)發(fā) 后端
語(yǔ)言方面,最主要的特性,是 Record。這是 C# 9 出來(lái)的一個(gè)新數(shù)據(jù)類(lèi)型。沒(méi)錯(cuò),Record 是一個(gè)數(shù)據(jù)類(lèi)型。

[[426499]]

本文轉(zhuǎn)載自微信公眾號(hào)「老王Plus」,作者老王Plus的老王。轉(zhuǎn)載本文請(qǐng)聯(lián)系老王Plus公眾號(hào)。

C# 9,對(duì)應(yīng)的是 Dotnet 5.0。

這個(gè)出來(lái)也有些日子了,不過(guò)好像群里很多人還是沒(méi)往這個(gè)版本走。

我這邊現(xiàn)在是全線已經(jīng)轉(zhuǎn)向了 5.0,還是我經(jīng)常說(shuō)的那個(gè)原因:爽。Dotnet 的每一次升級(jí),都有一些讓人驚喜的特性,讓代碼更合理,更節(jié)省時(shí)間。

1. 基礎(chǔ)語(yǔ)言方面

語(yǔ)言方面,最主要的特性,是 Record。這是 C# 9 出來(lái)的一個(gè)新數(shù)據(jù)類(lèi)型。沒(méi)錯(cuò),Record 是一個(gè)數(shù)據(jù)類(lèi)型。

這個(gè) Record 提供了一些很爽的表示數(shù)據(jù)的內(nèi)置功能,以至于使用的時(shí)候,感覺(jué)它更像一個(gè)類(lèi)。

按微軟的說(shuō)法,Record 的目的,是提供一個(gè)更小更簡(jiǎn)單的類(lèi)型來(lái)表示不可變數(shù)據(jù)。不過(guò)在使用中,我更喜歡用它來(lái)做數(shù)據(jù)傳輸。

定義一個(gè) Record

定義一個(gè) Record 有幾種方式。最簡(jiǎn)單的形式是:

  1. public record User( string nameint age ); 

第一次看這個(gè)東西,會(huì)有點(diǎn)奇怪,有沒(méi)有?長(zhǎng)得有點(diǎn)像方法,可就沒(méi)內(nèi)容。

嗯,這確實(shí)是 Record 的一個(gè)聲明定義,定義了一個(gè)對(duì)象 user,這個(gè)對(duì)象 user 具有 name 和 age 兩個(gè)屬性。可以通過(guò)以下方式來(lái)訪問(wèn):

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

確實(shí)跟類(lèi)有點(diǎn)像。

再來(lái)看看另一種定義方式,會(huì)更像一個(gè)類(lèi):

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

給 Record 賦值

既然長(zhǎng)得像類(lèi),我們可以像類(lèi)一樣去賦值:

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

還可以用位置語(yǔ)法,近一步簡(jiǎn)化:

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

注意這個(gè)位置語(yǔ)法,其實(shí)就是按位置匹配字段的意思。賦值時(shí)的值,會(huì)自動(dòng)去找對(duì)應(yīng)位置的屬性來(lái)匹配和校驗(yàn)。

而且,對(duì)于第一種簡(jiǎn)單定義:

  1. public record User( string nameint age ); 

賦值語(yǔ)句實(shí)際編譯時(shí),上面字段中的 set 會(huì)被替換為 init,即:

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

這意味著屬性在初始化后無(wú)法改變,會(huì)變成只讀屬性。

相等判斷

Record 對(duì)于相等的定義是內(nèi)部的屬性相等。也就是說(shuō),判斷兩個(gè) Record 是否相等時(shí),將檢查每個(gè)屬性的值,而不是對(duì)象的引用地址。

看例子:

  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 屬性相同,所以他們是相等的,盡管是兩個(gè)不同的引用。

不一樣的 ToString()

Record 的 ToString 是一個(gè)內(nèi)置方法,跟別的對(duì)象的 ToString 有很大區(qū)別。它會(huì)把 Record 的定義、屬性和值全部輸出。上面的例子,輸出的內(nèi)容將會(huì)是:

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

注意:如果某個(gè) Record 的屬性是引用類(lèi)型,ToString 將會(huì)輸出這個(gè)類(lèi)型的名稱。

Record 值的傳遞

這個(gè)內(nèi)容延續(xù)到了 C# 10,相關(guān)內(nèi)容我在 「Dotnet 6.0,你值得擁有」里有詳細(xì)的描述,可以去看看。

這里簡(jiǎn)單說(shuō)一下,就是使用 With:

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

定義 Init 屬性

C# 9 里,新增了一個(gè)對(duì)于屬性定義的 init 關(guān)鍵字。這個(gè)關(guān)鍵字可以用在 Struct、Class、Record 中,表示屬性僅在初始化時(shí)可以進(jìn)行設(shè)置。

例如:

  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 ); 

當(dāng)改變值時(shí),例如:

  1. some_user.name = "WangPlus1"

這個(gè)是有效的,但是:

  1. some_user.age = 36; 

這句話會(huì)報(bào)錯(cuò),因?yàn)樵谏厦娑x中,age 被定義為 init,即只有初始化時(shí)可以賦值。

以上是 C# 9 中增加的最重要的一個(gè)內(nèi)容:Record 類(lèi)型。

2. API 方面

API 方面,主要是三個(gè)特性。

1). 頂級(jí)程序

這算是大家盼了很久的一個(gè)特性。

早期,一個(gè)程序的開(kāi)始,會(huì)是這個(gè)樣子:

  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.     } 

現(xiàn)在有了頂級(jí)程序的規(guī)則,這一大段,可以直接簡(jiǎn)化為:

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

就OK了。Program 啦,Main 啦,統(tǒng)統(tǒng)都可以不寫(xiě)了。

對(duì)于 WebAPI 應(yīng)用也一樣:

  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.     } 

這是一個(gè)標(biāo)準(zhǔn)的 WebAPI 應(yīng)用的開(kāi)始。現(xiàn)在,也可以簡(jiǎn)化成:

  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.         }); 

這樣的代碼其實(shí)更簡(jiǎn)潔,而且可以直觀的說(shuō)明程序的意圖。如果你也經(jīng)常寫(xiě) Python,那你會(huì)很喜歡這個(gè)特性。

2). 新的匹配模式

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

第一類(lèi):邏輯匹配

這個(gè)主要是加入了 And、Or 和 Not。

以前,我們會(huì)用到這樣的判斷:

  1. if( input == null ) {} 

有時(shí)候,我們也會(huì)寫(xiě)成:

  1. if( input is null ) {} 

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

  1. if( input != null ) {} 

現(xiàn)在,我們有了更可讀的寫(xiě)法:

  1. if( int is not null ) {} 

看起來(lái)可讀性就很高了。

第二類(lèi):關(guān)系匹配

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

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

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

現(xiàn)在,這里面加入了范圍判斷,可以這么寫(xiě):

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

看到?jīng)]?更多的邏輯可以在 Switch 里實(shí)現(xiàn),而不用一大篇 if…else 了。

3). 類(lèi)型省略

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

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

  1. public List users = new List(); 

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

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

方法也是一樣。假設(shè)我們有一個(gè)方法:

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

以前調(diào)用時(shí),我們需要先給個(gè)變量,再調(diào)用方法:

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

現(xiàn)在,我們可以在方法中直接 New:

  1. Users.copyUser( new () ); 

當(dāng)然,這個(gè)特性也結(jié)合了上面 Record 的特性。

因此,我們還可以這么寫(xiě):

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

嗯,語(yǔ)庋的改變需要一點(diǎn)時(shí)間來(lái)適應(yīng),但從長(zhǎng)遠(yuǎn)來(lái)看,依然是一種進(jìn)步,會(huì)讓代碼更方便寫(xiě)和讀。同時(shí),這個(gè)特性,和 Var 會(huì)變成編程的兩個(gè)面,哪個(gè)更好用,看自己的習(xí)慣了。

3. 總結(jié)

總的來(lái)說(shuō),Dotnet 5.0 的變化還是有很多驚喜的。上面寫(xiě)的,只是我們能比較容易感受到的部分,感受不到的部分,比方編譯的合理性、性能的優(yōu)化,GC的回收,做得都相當(dāng)優(yōu)秀。

早轉(zhuǎn) 5.0 早好,對(duì)吧?

 

責(zé)任編輯:武曉燕 來(lái)源: 老王Plus
相關(guān)推薦

2021-01-09 14:03:37

Vrrp協(xié)議網(wǎng)關(guān)

2020-12-14 11:35:22

SPI Java機(jī)制

2018-01-10 14:34:05

IntelAMD顯卡

2020-11-27 07:45:31

JVM垃圾回收

2018-04-24 14:34:54

機(jī)器學(xué)習(xí)機(jī)器人互聯(lián)網(wǎng)

2023-03-04 21:31:57

大數(shù)據(jù)采集抽樣式

2013-09-11 09:37:12

C#之父C#

2023-12-19 09:24:22

LinuxBIOSUEFI

2012-04-04 22:07:12

Android

2020-08-06 15:14:07

D語(yǔ)言編程語(yǔ)言

2022-04-30 18:42:38

Go編程語(yǔ)言

2021-03-02 07:33:10

VSCode插件代碼

2024-07-26 08:10:10

2021-03-19 06:08:09

智慧城市物聯(lián)網(wǎng)城市服務(wù)

2020-08-29 18:51:14

效能工具效率生產(chǎn)力

2019-08-28 10:53:35

JavaScriptOptional Ch代碼

2010-06-03 15:30:01

Windows2008

2012-04-28 09:14:50

編程編程語(yǔ)錄

2009-08-25 17:15:50

C#隱藏C#重寫(xiě)C#重載

2021-01-07 07:33:06

Tomcat啟動(dòng)工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产一区二区精品在线观看 | 伊人狠狠操| 精品欧美一区二区久久久伦 | 国产真实精品久久二三区 | 欧美成人h版在线观看 | 日日骚网 | 久久久久久国产精品免费免费 | 午夜视频一区二区 | 国产毛片视频 | 色婷婷激情| 秋霞在线一区二区 | 久久久蜜桃 | 一区二区三区四区电影视频在线观看 | 国产a级黄色录像 | 久久国产一区二区 | 在线免费观看a级片 | 91精品久久久久久久久中文字幕 | 国产午夜精品久久久 | av大片 | 亚洲狠狠 | 欧美成年网站 | 99久久精品国产一区二区三区 | 亚洲色图第一页 | 成人在线小视频 | 中文字幕日本一区二区 | 一级片在线观看视频 | 日韩免费一区二区 | 国产亚洲精品久久午夜玫瑰园 | 久久精品一区二区 | 国产视频精品在线观看 | 范冰冰一级做a爰片久久毛片 | 亚洲国产欧美一区 | 一区二区三区在线观看视频 | 久久久久一区 | 亚洲精品国产第一综合99久久 | 蜜桃久久 | 久久久久国产精品一区二区 | 亚洲导航深夜福利涩涩屋 | 91视频播放 | 午夜看看 | 日韩av在线中文字幕 |