新聞中心
本文轉(zhuǎn)載自微信公眾號(hào)「DotNET技術(shù)圈」,作者鄒溪源 。轉(zhuǎn)載本文請(qǐng)聯(lián)系DotNET技術(shù)圈公眾號(hào)。

十年的恭城網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整恭城建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“恭城網(wǎng)站設(shè)計(jì)”,“恭城網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
引子
前不久看到一個(gè)段子,某年寧波交警引進(jìn)人臉識(shí)別技術(shù)抓拍行人闖紅燈,結(jié)果一天下來(lái)被發(fā)現(xiàn)闖紅燈次數(shù)最多的是珠海女子董小姐,日闖紅燈3000多次。寧波交警連夜研究抓捕方案,最后分析發(fā)現(xiàn),原來(lái)是大巴車上的某掌握核心的產(chǎn)品廣告被錯(cuò)誤識(shí)別了。
這家自稱掌握了核心的制造企業(yè),雖然并非每個(gè)產(chǎn)品都賣(mài)座,但這樣的廣告詞確實(shí)也牢牢抓住了觀眾的眼球,簡(jiǎn)單明了的廣告詞,使產(chǎn)品具備更加鮮明的標(biāo)簽,形成了其獨(dú)特的品牌形象。
最近,又看到某汽車制造大廠,雖然業(yè)績(jī)不怎么樣,但其董事長(zhǎng)的眼界之高令人欽佩。在股東會(huì)上,有股東詢問(wèn)過(guò)去業(yè)績(jī)不佳,是否有興趣在無(wú)人駕駛技術(shù)上跟某民族品牌建立進(jìn)一步合作關(guān)系時(shí),這位董事長(zhǎng)也毫不猶豫的回答到:
“不接受xx提供的無(wú)人駕駛整體解決方案,要將核心技術(shù)掌握在自己手中?!?/p>
至于這家公司是否真的掌握了核心技術(shù),也許有讀者作為該公司的產(chǎn)品用戶,或汽車產(chǎn)業(yè)從業(yè)人員,或甚至是股東,可能比較清楚,小編比較菜,對(duì)這種核心技術(shù)不太了解。
但小編從這兩個(gè)案例發(fā)現(xiàn)了一個(gè)現(xiàn)象,核心技術(shù)無(wú)論對(duì)于公司而言,還是對(duì)于個(gè)人而言,都是非常有價(jià)值的關(guān)鍵特性。一個(gè)掌握了核心技術(shù)的開(kāi)發(fā)者,必然是脫離了低級(jí)趣味的專業(yè)開(kāi)發(fā)者,在紛繁復(fù)雜的互聯(lián)網(wǎng)時(shí)代面前,往往有更多機(jī)會(huì)凸顯自己的才華,進(jìn)而獲得與自己實(shí)力相匹配的待遇水平。
毫無(wú)疑問(wèn),掌握C#的核心技術(shù)也同樣如此。那么,問(wèn)題是,C#的核心技術(shù)有哪些呢?我們?cè)撊绾握莆誄#的核心技術(shù)呢?
C#的發(fā)展歷程
眾所周知,C#是由偉大的程序員之神Anders Hejlsberg為體現(xiàn).NET技術(shù)的優(yōu)勢(shì)而創(chuàng)造出來(lái)的一種優(yōu)秀語(yǔ)言。說(shuō)起Anders Hejlsberg雖然可能有的讀者不太熟悉,但說(shuō)起他創(chuàng)造的幾種語(yǔ)言或編譯器,大家估計(jì)就并不陌生了。
例如他20歲時(shí)花了僅僅兩三周就開(kāi)發(fā)出來(lái)了一種Pascal編譯器。之后他又開(kāi)發(fā)出了Delphi,這是一種非常神奇的語(yǔ)言,在面向過(guò)程式開(kāi)發(fā)方法的時(shí)代,Delphi能夠與VB獨(dú)占半邊天,其優(yōu)秀之處顯然不是區(qū)區(qū)幾句話就能說(shuō)清楚,聽(tīng)說(shuō)在當(dāng)時(shí),許多開(kāi)發(fā)者都非常擅長(zhǎng)使用其創(chuàng)造奇跡,例如今天的產(chǎn)品之神張小龍?jiān)?0年前就曾經(jīng)用其開(kāi)發(fā)過(guò)foxmail,早期的wps據(jù)說(shuō)也是使用Delphi開(kāi)發(fā)出來(lái)的。
再后來(lái),Anders加入了微軟,并為.NET設(shè)計(jì)了C#這樣一款優(yōu)秀的語(yǔ)言。(當(dāng)然,Anders并未止步于C#這樣的成就,在C#之后,他又改良了Javascript,并為其帶來(lái)了今天的“后端噩夢(mèng)”TypeScript語(yǔ)言。)
2002年,C#隨.NET戰(zhàn)略一起發(fā)布,從一開(kāi)始就被定位為.NET開(kāi)發(fā)框架核心中的核心,直到今天,已經(jīng)成為一種比較優(yōu)秀的主流技術(shù)語(yǔ)言。這種語(yǔ)言吸收了其他語(yǔ)言的優(yōu)勢(shì),同時(shí)又基于.NET框架的特性實(shí)現(xiàn)了許多優(yōu)雅的功能,今天的C#,不僅僅能夠用于傳統(tǒng)的面向?qū)ο箝_(kāi)發(fā),也同樣可以廣泛使用于函數(shù)式開(kāi)發(fā)方法。對(duì)于初學(xué)者而言,如果學(xué)過(guò)Java和C++語(yǔ)言,上手也非常容易。
經(jīng)過(guò)將近20年的發(fā)展,C#語(yǔ)言已經(jīng)迭代了15個(gè)主要版本,從最早期的C#1.0到現(xiàn)在最新版的9.0,及10.0預(yù)覽版,共發(fā)布了6次正式版本發(fā)布,對(duì)于許多開(kāi)發(fā)者而言,每一次版本升級(jí)也意味著又需要刷新技術(shù)面,著實(shí)是一種痛并快樂(lè)的過(guò)程。
回顧那么多個(gè)版本,你還記得哪些C#的“核心技術(shù)”給你帶來(lái)過(guò)開(kāi)發(fā)效率的巨大提升么?
《C#的核心技術(shù)指南》中的核心技術(shù)
最近,我有幸閱讀了新出版的《C#8.0核心技術(shù)指南》,并在這篇文章中,我摘取了幾個(gè)C#相關(guān)的新特性和概念跟大家一起分享。當(dāng)然由于C#實(shí)際上是.NET框架的主力語(yǔ)言,以下介紹的一些核心技術(shù),可能實(shí)質(zhì)上是.NET框架的核心技術(shù),大家不用糾結(jié)這個(gè)問(wèn)題。
C#9.0新特性
參見(jiàn)https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-9。
C#8.0的新特性
參見(jiàn)https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-8
C#可為空類型
3.1 可為空值類型
可為空值類型是針對(duì)基礎(chǔ)類型而言,例如Int?bool?double?這些基礎(chǔ)類型都是我們常用的可為空值類型,該類型出現(xiàn)得比較早,在C#2.0中就已經(jīng)出現(xiàn)了可為空值類型。
檢查可為空值類型的實(shí)例
從C#7.0開(kāi)始,可以使用is表達(dá)式對(duì)可為空值類型進(jìn)行檢查,
- int? a = 42;
- if (a is int valueOfA)
- {
- Console.WriteLine($"a is {valueOfA}");
- }
- else
- {
- Console.WriteLine("a does not have a value");
- }
- // Output:
- // a is 42
當(dāng)然,依然可以使用HasValue這種類型對(duì)可為空值類型進(jìn)行檢查。
3.2 C#可為空引用類型
可為空值類型常用于數(shù)據(jù)庫(kù)的檢查中,可以通過(guò)該類型判斷對(duì)象是否為空,而可為空引用類型則恰好相反,可以一定程度上防止引用類型的值為空,避免引發(fā) “未將對(duì)象引用添加到對(duì)象的實(shí)例”這樣的空指針異常。
該類型自C#8.0 引入,包括兩種方式“可為空引用類型”和“不可為空引用類型”,使你能夠?qū)σ妙愋妥兞康膶傩宰鞒鲋匾暶?:
- 引用不應(yīng)為 null。當(dāng)變量不應(yīng)為 null 時(shí),編譯器會(huì)強(qiáng)制執(zhí)行規(guī)則,以確保在不首先檢查它們是否為 null 的情況下,取消引用這些變量是安全的:
- 必須將變量初始化為非 null 值。
- 變量永遠(yuǎn)不能賦值為 null。
- 引用可為 null。當(dāng)變量可以為 null 時(shí),編譯器會(huì)強(qiáng)制執(zhí)行不同的規(guī)則以確保你已正確檢查空引用:
- 只有當(dāng)編譯器可以保證該值不為 null 時(shí),才可以取消引用該變量。
- 這些變量可以使用默認(rèn)的 null 值進(jìn)行初始化,也可以在其他代碼中賦值為 null。類型為 Null 性
例如,在常用的語(yǔ)句中,我們可能這樣實(shí)現(xiàn):
- void foo(string? s)=>Console.WriteLine(s.Length);
一旦出現(xiàn)了string為空的情況,可能很容易就會(huì)引發(fā)空指針異常。
可為空上下文
可為空上下文可以對(duì)編譯器如何解釋引用類型變量進(jìn)行精細(xì)控制。
可以使用 .csproj 文件中的 Nullable 元素為項(xiàng)目設(shè)置可為空注釋上下文和可為空警告上下文。此元素配置編譯器如何解釋類型的為 Null 性以及生成哪些警告。有效設(shè)置如下:
- enable
:“啟用”可為空注釋上下文?!皢⒂谩笨蔀榭站嫔舷挛摹?/p>
引用類型的變量,例如 string 是“不可為空”。啟用所有為 Null 性警告。
- warnings
:“禁用”可為空注釋上下文?!皢⒂谩笨蔀榭站嫔舷挛?。
引用類型的變量是“無(wú)視”。啟用所有為 Null 性警告。
- annotations
:“啟用”可為空注釋上下文。“禁用”可為空警告上下文。
引用類型的變量(例如字符串)不可為 null。禁用所有為 Null 性警告。
- disable
:“禁用”可為空注釋上下文?!敖谩笨蔀榭站嫔舷挛?。
引用類型的變量是“無(wú)視”,就像早期版本的 C# 一樣。禁用所有為 Null 性警告。
示例:
XML復(fù)制
enable
你還可以使用指令在項(xiàng)目的任何位置設(shè)置這些相同的上下文:
- #nullable enable:將可為空注釋上下文和可為空警告上下文設(shè)置為“已啟用”。
- #nullable disable:將可為空注釋上下文和可為空警告上下文設(shè)置為“已禁用”。
- #nullable restore:將可為空注釋上下文和可為空警告上下文還原到項(xiàng)目設(shè)置。
- #nullable disable warnings:將可為空警告上下文設(shè)置為“已禁用”。
- #nullable enable warnings:將可為空警告上下文設(shè)置為“已啟用”。
- #nullable restore warnings:將可為空警告上下文還原到項(xiàng)目設(shè)置。
- #nullable disable annotations:將可為空注釋上下文設(shè)置為“禁用”。
- #nullable enable annotations:將可為空注釋上下文設(shè)置為“啟用”。
- #nullable restore annotations:將注釋警告上下文還原到項(xiàng)目設(shè)置。
屬性模式
C#在7.0中引入了屬性模式,通過(guò)該模式,可以快速匹配對(duì)象的一個(gè)或多個(gè)屬性值。例如,我們可以使用這樣的示例快速匹配相關(guān)屬性值。
- if (obj is string s && s.Length=4)
除了這種屬性模式,還有一種是C#8.0中引入的模式,該模式主要用于switch語(yǔ)句的用法,使用起來(lái)也非常簡(jiǎn)潔。
- bool ShouldAllow(Url url)=>url switch
- {
- {Scheme:"http",Port=80}=>true,
- {Scheme:"https",port=443}=>true
- }
屬性模式還支持嵌套,例如
- bool ShouldAllow(Url url)=>url switch
- {
- {Scheme:string{Length:4},Port=80}=>true,
- {Scheme:"https",port=443}=>true
- }
甚至支持使用when子句。例如:
- {Scheme:"http",Port:80} when url.Host.Length<1000=>true,
這樣的寫(xiě)法可以使我們部分邏輯代碼變得更加精簡(jiǎn),看起來(lái)更有逼格。
屬性還提供了元組模式,位置模式兩種模式,元組模式提供了切換多個(gè)值的簡(jiǎn)單機(jī)制,而位置模式則定義了使用對(duì)象的位置屬性作為匹配模式的方式。
以下是官方文檔關(guān)于位置模式的示例。
- public readonly struct Point
- {
- public int X { get; }
- public int Y { get; }
- public Point(int x, int y) => (X, Y) = (x, y);
- public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
- }
- static string Classify(Point point) => point switch
- {
- (0, 0) => "Origin",
- (1, 0) => "positive X basis end",
- (0, 1) => "positive Y basis end",
- _ => "Just a point",
- };
不過(guò),官方文檔并沒(méi)有介紹元組模式的示例,而《C#8.0核心技術(shù)指南》中介紹了該模式的用法,大家可以從書(shū)中獲取相關(guān)知識(shí)。
Json處理
過(guò)去,我們傾向于使用Json.NET來(lái)處理C#中的Json序列化問(wèn)題,而現(xiàn)在,我們則可以依托官方庫(kù)Sytem.Text.Json來(lái)完成。(雖然我們有時(shí)可能不愿意用,但往后官方的許多方法會(huì)更多的依賴該庫(kù)來(lái)實(shí)現(xiàn))。相比json.net,該官方庫(kù)的主要優(yōu)點(diǎn)是更簡(jiǎn)單、高效并且內(nèi)存使用效率更高。
官方庫(kù)提供了如下幾種操作形式:
1、Utf8JsonReader:這是一種優(yōu)化的前向Json讀取器,用于讀取Utf8編碼的Json文本。
2、Uft8JsonWriter:這是一種Json輸出器,可用于輸出Utf8編碼Json文本。
3、JsonDocument:該類型可以將Json數(shù)據(jù)解析為只讀的DOM,可以用類似于XMLDocument的方式操作延遲加載的JsonElement示例。同時(shí),也可以用JsonDocument讀取對(duì)象,并使用Json寫(xiě)入器對(duì)Json進(jìn)行更新。
Span和Memory
Span和Memory是.NET 5中引入的新的結(jié)構(gòu)體。是數(shù)組、字符串或任意連續(xù)的托管內(nèi)存或非托管內(nèi)存結(jié)構(gòu)的底層抽象,其主要目的是進(jìn)行特定的微優(yōu)化,尤其是編寫(xiě)需要盡可能降低內(nèi)存分配(從而減輕垃圾回收器負(fù)載)的低內(nèi)存分配代碼。
Span和Memory適用于各種性能熱點(diǎn),例如Asp.NET CORE的處理流水線以及字節(jié)流的解析等操作常見(jiàn),具有更佳的性能。Span 是在堆棧上分配的 引用結(jié)構(gòu)[1] ,而不是在托管堆上分配的。
Span 表示任意內(nèi)存的連續(xù)區(qū)域。以下為官方文檔提供的示例:
- // Create a span over an array.
- var array = new byte[100];
- var arraySpan = new Span
(array); - byte data = 0;
- for (int ctr = 0; ctr < arraySpan.Length; ctr++)
- arraySpan[ctr] = data++;
- int arraySum = 0;
- foreach (var value in array)
- arraySum += value;
- Console.WriteLine($"The sum is {arraySum}");
- // Output: The sum is 4950
由于 Span 是任意內(nèi)存塊的抽象,因此 Span 具有參數(shù)的類型和方法的方法將 Span 在任何對(duì)象上操作, Span 而不考慮它所封裝的內(nèi)存類型。
Span 包含方法的兩個(gè)重載 Slice[2] ,該方法構(gòu)成從指定索引處開(kāi)始的當(dāng)前范圍的切片。這樣一來(lái),就可以將中的數(shù)據(jù) Span 作為一組邏輯塊進(jìn)行處理,數(shù)據(jù)處理管道的部分可以按需處理這些數(shù)據(jù)塊,并對(duì)性能的影響最小。例如,由于新式服務(wù)器協(xié)議通常基于文本,因此字符串和子字符串的操作非常重要。
可以使用或刪除此分配和復(fù)制操作 Span ReadOnlySpan[3] ,如下面的示例所示:
- using System;
- class Program
- {
- static void Main()
- {
- string contentLength = "Content-Length: 132";
- var length = GetContentLength(contentLength.ToCharArray());
- Console.WriteLine($"Content length: {length}");
- }
- private static int GetContentLength(ReadOnlySpan
span) - {
- var slice = span.Slice(16);
- return int.Parse(slice);
- }
- }
- // Output:
- // Content length: 132
結(jié)語(yǔ)
由于時(shí)間關(guān)系,本文僅對(duì)部分內(nèi)容進(jìn)行了簡(jiǎn)單整理,尚不足以對(duì)C#核心技術(shù)進(jìn)行總結(jié),而最適合深度了解C#核心技術(shù)的方式,除了通過(guò)官方學(xué)習(xí)網(wǎng)站來(lái)了解,可能就是獲得一本深度介紹C#核心技術(shù)的書(shū)籍,跟著作者的節(jié)奏來(lái)接觸相關(guān)知識(shí)體系,了解相關(guān)代碼,并手把手的練上一練。
而雖然市場(chǎng)上目前介紹C#相關(guān)技術(shù)書(shū)籍比較多,我比較推薦機(jī)械工業(yè)出版社華章IT出版的這本《C#8核心技術(shù)指南》。作者的介紹也提到,這本書(shū)將回答你在C#8.0或.NET CORE學(xué)習(xí)過(guò)程中遇到的各種問(wèn)題,該書(shū)圍繞概念和用例進(jìn)行組織,不但為中高級(jí)程序員提供了簡(jiǎn)明的C#和.NET知識(shí)體系,還進(jìn)行了一系列深度探索。
雖然目前最新的C#已經(jīng)刷新到10.0預(yù)覽版,但翻譯書(shū)的出版速度可能并沒(méi)有那么快,即使是C#9.0,也最快要到明年出版,所以這本《C#8核心技術(shù)指南》算是市場(chǎng)上介紹C#8最成熟、最系統(tǒng)的的書(shū)籍。
分享名稱:如何掌握C#的核心技術(shù)
鏈接分享:http://www.dlmjj.cn/article/cogoddj.html


咨詢
建站咨詢
