C# 10 的五大最新功能

C# 的 GitHub 頁(yè)面上記載了一長(zhǎng)串誘人的想法澄耍,其中一些令人頭疼的問題仍在討論中。如果你想知道C# 10中究竟包含了哪些新功能晌缘,可以等待11 月新版本的發(fā)布齐莲。或者枚钓,你也可以關(guān)注 C# 團(tuán)隊(duì)展示的他們最喜歡的功能。在最近的微軟Build 大會(huì)上瑟押,C# 的首席設(shè)計(jì)師 Mads Torgersen 透漏了一些目前正在進(jìn)行的工作搀捷。以下是該語(yǔ)言的下一個(gè)版本將會(huì)提供的五大新功能。

global using

C# 的源代碼文件開頭一般都會(huì)導(dǎo)入一堆命名空間多望。下面是一個(gè)普通的ASP.NET Web 應(yīng)用程序的代碼片段:

using LoggingTestApp.Data;

using Microsoft.AspNetCore.Builder;

using Microsoft.AspNetCore.Hosting;

using Microsoft.AspNetCore.HttpsPolicy;

using Microsoft.AspNetCore.Identity;

using Microsoft.AspNetCore.Identity.UI;

using Microsoft.EntityFrameworkCore;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.DependencyInjection;

using Microsoft.Extensions.Hosting;

using Serilog;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

namespace LoggingTestApp

{

public class Startup

? ? {

? ? ? ? ...

? ? }

}

這段代碼的寫法沒有什么特別之處嫩舟。以前,命名空間的導(dǎo)入可以讓我們快速了解某個(gè)類正在使用哪些庫(kù)怀偷。然而如今家厌,這只不過是一堆不得不寫又沒人去看的代碼了。C# 10 引入了一種新模式椎工,允許你使用關(guān)鍵字 global 定義整個(gè)項(xiàng)目的命名空間導(dǎo)入饭于。推薦做法是,將全局導(dǎo)入放在一個(gè)單獨(dú)的文件中(每個(gè)項(xiàng)目一個(gè))维蒙,可以命名為 usings.cs 或imports.cs掰吕。其中的內(nèi)容大致為:

global using Microsoft.AspNetCore.Builder;

global using Microsoft.AspNetCore.Hosting;

global using Microsoft.AspNetCore.HttpsPolicy;

global using Microsoft.AspNetCore.Identity;

global using Microsoft.AspNetCore.Identity.UI;

global using Microsoft.EntityFrameworkCore;

global using Microsoft.Extensions.Configuration;

global using Microsoft.Extensions.DependencyInjection;

global using Microsoft.Extensions.Hosting;

global using System;

global using System.Collections.Generic;

global using System.Linq;

global using System.Threading.Tasks;

然后就可以簡(jiǎn)化原來的文件了:

using LoggingTestApp.Data;

using Serilog;

namespace LoggingTestApp

{

public class Startup

? ? {

? ? ? ? ...

? ? }

}

Visual Studio會(huì)突出顯示重復(fù)的命名空間(即同時(shí)在全局文件和本地文件中導(dǎo)入的命名空間)。盡管這不是錯(cuò)誤颅痊,但刪除重復(fù)的命名空間可以減少代碼量殖熟,并將注意力集中在特定文件正在使用的特殊命名空間上。

文件范圍的命名空間

C# 10 提供了另一種簡(jiǎn)化代碼的方法:聲明文件范圍的命名空間斑响。文件范圍的命名空間會(huì)自動(dòng)應(yīng)用于整個(gè)文件菱属,而且無需縮進(jìn)。換句話說舰罚,下面這種寫法:

namespace LoggingTestApp

{

public class Startup

? ? {

? ? ? ? ...

? ? }

}

可以變成:

namespace LoggingTestApp;

public class Startup

{

? ? ...

}

如果在使用了文件范圍命名空間的文件中纽门,再添加一個(gè)命名空間塊,則會(huì)創(chuàng)建一個(gè)嵌套命名空間:

namespace Company.Product;

// This block creates the namespace Company.Product.Component

namespace Component

{

}

C# 設(shè)計(jì)者認(rèn)為這個(gè)改動(dòng)可以清理水平空間的浪費(fèi)(就像global using清理了垂直空間的浪費(fèi)一樣)营罢∧せ伲總體目標(biāo)是讓代碼更短、更窄、更簡(jiǎn)潔瘟滨。但這些變化也可以降低新手學(xué)習(xí)C#的難度候醒。結(jié)合global using與文件范圍的命名空間,只需幾行代碼就可以創(chuàng)建出一個(gè)Hello World 控制臺(tái)應(yīng)用程序杂瘸。

空參數(shù)檢查

本著減少樣板代碼的精神倒淫,C# 提供了一個(gè)非常好的新功能:空參數(shù)檢查。你肯定編寫過需要檢查空值的方法败玉。比如敌土,如下代碼:

public UpdateAddress(int personId, Address newAddress)

{

if (newAddress == null)

? ? {

throw new ArgumentNullException("newAddress");

? ? }

? ? ...

}

如今,你只需要在參數(shù)名稱末尾添加“!!”运翼,C#就會(huì)自動(dòng)加入這種空參數(shù)檢查返干。上述代碼可以簡(jiǎn)化為:

public UpdateAddress(int personId, Address newAddress!!)

{

? ? ...

}

現(xiàn)在,如果傳遞一個(gè)空值給 Address血淌,就會(huì)自動(dòng)拋出 ArgumentNullException矩欠。這種細(xì)節(jié)可能看似微不足道,但實(shí)際上這是非常簡(jiǎn)單又很有價(jià)值的優(yōu)化語(yǔ)言的方式悠夯。大量研究表明癌淮,導(dǎo)致程序出錯(cuò)的原因往往是由于非常容易避免的錯(cuò)誤反復(fù)發(fā)生,不是因?yàn)榇a中的概念太復(fù)雜沦补,而是因?yàn)殚喿x代碼很累乳蓄,而人類的注意力有限。減少代碼量可以減少審查代碼所需的時(shí)間夕膀,處理代碼所需的認(rèn)知負(fù)荷虚倒,以及由于注意力減弱而忽略某些錯(cuò)誤的可能性。

required 屬性

以前产舞,我們只能通過類構(gòu)造函數(shù)來確保正確地創(chuàng)建對(duì)象裹刮。如今,我們經(jīng)常使用更加輕量級(jí)的結(jié)構(gòu)庞瘸,比如下面這個(gè)記錄中自動(dòng)實(shí)現(xiàn)的屬性:

public record Employee

{

? ? public string Name { get; init; }

? ? public decimal YearlySalary { get; init; }

? ? public DateTime HiredDate{ get; init; }

}

在創(chuàng)建這類輕量級(jí)對(duì)象的實(shí)例時(shí)捧弃,我們可能會(huì)使用對(duì)象的初始化語(yǔ)法:

var theNewGuy = new Employee

{

? ?Name = "Dave Bowman",

? ?YearlySalary = 100000m,

? ?HiredDate = DateTime.Now()

};

但是,如果你的對(duì)象中的某些屬性是必須的擦囊,該怎么辦违霞?你可以像以前一樣,添加一個(gè)構(gòu)造函數(shù)瞬场,但如此一來就需要添加更多的樣板代碼了买鸽。此外,將值從一個(gè)參數(shù)復(fù)制到屬性也是另一個(gè)很容易理解但很常見的錯(cuò)誤贯被。C# 10 引入的關(guān)鍵字 required 可以消滅這類問題:

public record Employee

{

? ? public required string Name { get; init; }

? ? public decimal YearlySalary { get; init; }

? ? public DateTime HiredDate{ get; init; }

}

如此一來眼五,如果不設(shè)置 Name 屬性就無法創(chuàng)建 Employee 了妆艘。

關(guān)鍵字field

多年來,為了通過自動(dòng)實(shí)現(xiàn)屬性簡(jiǎn)化代碼看幼,C# 團(tuán)隊(duì)做出了大量努力批旺,上面的 Employee 記錄就是一個(gè)很好的例子,它使用 get 和 init 關(guān)鍵字聲明了三個(gè)不可變的屬性诵姜。數(shù)據(jù)存儲(chǔ)在三個(gè)私有字段中汽煮,但這些字段都是自動(dòng)創(chuàng)建的,無需人工干預(yù)棚唆。而且你永遠(yuǎn)不會(huì)看到這些字段暇赤。自動(dòng)實(shí)現(xiàn)的屬性很棒,但它們的作用也僅限于此宵凌。當(dāng)無法使用自動(dòng)實(shí)現(xiàn)的屬性時(shí)鞋囊,你就必須添加支持字段到類,并編寫正常的屬性方法瞎惫,就像回到 C# 2一樣溜腐。但是 C# 10中提供了一個(gè)關(guān)鍵字field,可以自動(dòng)創(chuàng)建支持字段微饥。例如逗扒,假設(shè)你想創(chuàng)建一個(gè)記錄古戴,用于處理初始屬性值欠橘。在下面的代碼中,我們對(duì) Employee 類進(jìn)行了一些修改现恼,確保HiredDate 字段只包含來自 DateTime 對(duì)象的日期信息(不包含時(shí)間信息):

public record Employee

{

? ? public required string Name { get; init; }

? ? public decimal YearlySalary { get; init; }

? ? public DateTime HiredDate{ get; init => field = value.Date(); }

}

這段代碼非常整潔肃续、簡(jiǎn)單,而且很接近聲明式叉袍。你可以使用關(guān)鍵字 field 訪問 get始锚、set 或 init 中的字段。而且喳逛,你可能需要驗(yàn)證某個(gè)屬性瞧捌,就像驗(yàn)證普通類中的屬性一樣:

private string _firstName;

public string FirstName

{

? ? get

? ? {

? ? ? ? return _firstName;

? ? }

? ? set

? ? {

? ? ? ? if (value.Trim() == "")

? ? ? ? ? ? throw new ArgumentException("No blank strings");

? ? ? ? _firstName = value;

? ? }

}

你可以使用 field 來驗(yàn)證自動(dòng)實(shí)現(xiàn)的屬性:

public string FirstName {get;

? ? set

? ? {

? ? ? ? if (value.Trim() == "")

? ? ? ? ? ? throw new ArgumentException("No blank strings");

? ? ? ? field = value;

? ? }

}

本質(zhì)上,只要不需要修改屬性的數(shù)據(jù)類型润文,就不需要自行聲明支持字段姐呐。

總結(jié)

當(dāng)然,C# 10中的新功能肯定不止這個(gè)五個(gè)典蝌。還有一些表達(dá)式方面的變化曙砂,以及一個(gè)有爭(zhēng)議的變動(dòng):在接口中定義靜態(tài)成員。我們只有耐心等待了骏掀○海總體來看柱告,C# 10 的發(fā)展重點(diǎn)很明確,即減少代碼量笑陈,提供更多便利性际度,減輕開發(fā)人員的負(fù)擔(dān) 作者:微軟MVP-Eleven https://www.bilibili.com/read/cv12057334 出處:bilibili

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市新锈,隨后出現(xiàn)的幾起案子甲脏,更是在濱河造成了極大的恐慌,老刑警劉巖妹笆,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件块请,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拳缠,警方通過查閱死者的電腦和手機(jī)墩新,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窟坐,“玉大人海渊,你說我怎么就攤上這事≌茉В” “怎么了臣疑?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)徙菠。 經(jīng)常有香客問我讯沈,道長(zhǎng),這世上最難降的妖魔是什么婿奔? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任缺狠,我火速辦了婚禮,結(jié)果婚禮上萍摊,老公的妹妹穿的比我還像新娘挤茄。我一直安慰自己,他們只是感情好冰木,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布穷劈。 她就那樣靜靜地躺著,像睡著了一般踊沸。 火紅的嫁衣襯著肌膚如雪歇终。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天雕沿,我揣著相機(jī)與錄音练湿,去河邊找鬼。 笑死审轮,一個(gè)胖子當(dāng)著我的面吹牛肥哎,可吹牛的內(nèi)容都是我干的辽俗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼篡诽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼崖飘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杈女,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朱浴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后达椰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翰蠢,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年啰劲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梁沧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝇裤,死狀恐怖廷支,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栓辜,我是刑警寧澤恋拍,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站藕甩,受9級(jí)特大地震影響施敢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辛萍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一悯姊、第九天 我趴在偏房一處隱蔽的房頂上張望羡藐。 院中可真熱鬧贩毕,春花似錦、人聲如沸仆嗦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瘩扼。三九已至谆甜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間集绰,已是汗流浹背规辱。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栽燕,地道東北人罕袋。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓改淑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親浴讯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朵夏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • C#新功能 一、C#歷史演變 C# 1榆纽,Visual Studio .NET 2002: C# 初版仰猖。 C# 1....
    165e0c0b59d2閱讀 2,551評(píng)論 0 3
  • 這些是C#和ASP.NET數(shù)據(jù)庫(kù)面試題,全部從網(wǎng)上收集而來奈籽,經(jīng)整理而發(fā)表饥侵,希望給大家?guī)韼椭绣e(cuò)誤的地方還請(qǐng)各位...
    itming閱讀 768評(píng)論 1 9
  • 上學(xué)時(shí)學(xué)習(xí)C#和.NET衣屏,當(dāng)時(shí)網(wǎng)上的資源不像現(xiàn)在這樣豐富爆捞,所以去電腦城買了張盜版的VS2005的光盤,安裝時(shí)才發(fā)現(xiàn)...
    編程小世界閱讀 304評(píng)論 0 0
  • 一直用C#開發(fā)程序,.NET的功能越來越多藕赞,變化也挺大的成肘,從最初的封閉,到現(xiàn)在的開源斧蜕,功能不斷的增加双霍,一直在進(jìn)步。...
    編程小世界閱讀 283評(píng)論 0 1
  • C#(C-Sharp)是Microsoft的新編程語(yǔ)言批销,被譽(yù)為“C/C++家族中第一種面向組件的語(yǔ)言”洒闸。然而,不管...
    浮生歲月閱讀 3,741評(píng)論 0 7