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

如何掌握C#的核心技術

開發 前端
C#是由偉大的程序員之神Anders Hejlsberg為體現.NET技術的優勢而創造出來的一種優秀語言。說起Anders Hejlsberg雖然可能有的讀者不太熟悉,但說起他創造的幾種語言或編譯器,大家估計就并不陌生了。

[[413665]]

本文轉載自微信公眾號「DotNET技術圈」,作者鄒溪源 。轉載本文請聯系DotNET技術圈公眾號。

引子

前不久看到一個段子,某年寧波交警引進人臉識別技術抓拍行人闖紅燈,結果一天下來被發現闖紅燈次數最多的是珠海女子董小姐,日闖紅燈3000多次。寧波交警連夜研究抓捕方案,最后分析發現,原來是大巴車上的某掌握核心的產品廣告被錯誤識別了。

這家自稱掌握了核心的制造企業,雖然并非每個產品都賣座,但這樣的廣告詞確實也牢牢抓住了觀眾的眼球,簡單明了的廣告詞,使產品具備更加鮮明的標簽,形成了其獨特的品牌形象。

最近,又看到某汽車制造大廠,雖然業績不怎么樣,但其董事長的眼界之高令人欽佩。在股東會上,有股東詢問過去業績不佳,是否有興趣在無人駕駛技術上跟某民族品牌建立進一步合作關系時,這位董事長也毫不猶豫的回答到:

“不接受xx提供的無人駕駛整體解決方案,要將核心技術掌握在自己手中。“

至于這家公司是否真的掌握了核心技術,也許有讀者作為該公司的產品用戶,或汽車產業從業人員,或甚至是股東,可能比較清楚,小編比較菜,對這種核心技術不太了解。

但小編從這兩個案例發現了一個現象,核心技術無論對于公司而言,還是對于個人而言,都是非常有價值的關鍵特性。一個掌握了核心技術的開發者,必然是脫離了低級趣味的專業開發者,在紛繁復雜的互聯網時代面前,往往有更多機會凸顯自己的才華,進而獲得與自己實力相匹配的待遇水平。

毫無疑問,掌握C#的核心技術也同樣如此。那么,問題是,C#的核心技術有哪些呢?我們該如何掌握C#的核心技術呢?

C#的發展歷程

眾所周知,C#是由偉大的程序員之神Anders Hejlsberg為體現.NET技術的優勢而創造出來的一種優秀語言。說起Anders Hejlsberg雖然可能有的讀者不太熟悉,但說起他創造的幾種語言或編譯器,大家估計就并不陌生了。

例如他20歲時花了僅僅兩三周就開發出來了一種Pascal編譯器。之后他又開發出了Delphi,這是一種非常神奇的語言,在面向過程式開發方法的時代,Delphi能夠與VB獨占半邊天,其優秀之處顯然不是區區幾句話就能說清楚,聽說在當時,許多開發者都非常擅長使用其創造奇跡,例如今天的產品之神張小龍在30年前就曾經用其開發過foxmail,早期的wps據說也是使用Delphi開發出來的。

再后來,Anders加入了微軟,并為.NET設計了C#這樣一款優秀的語言。(當然,Anders并未止步于C#這樣的成就,在C#之后,他又改良了Javascript,并為其帶來了今天的“后端噩夢”TypeScript語言。)

2002年,C#隨.NET戰略一起發布,從一開始就被定位為.NET開發框架核心中的核心,直到今天,已經成為一種比較優秀的主流技術語言。這種語言吸收了其他語言的優勢,同時又基于.NET框架的特性實現了許多優雅的功能,今天的C#,不僅僅能夠用于傳統的面向對象開發,也同樣可以廣泛使用于函數式開發方法。對于初學者而言,如果學過Java和C++語言,上手也非常容易。

經過將近20年的發展,C#語言已經迭代了15個主要版本,從最早期的C#1.0到現在最新版的9.0,及10.0預覽版,共發布了6次正式版本發布,對于許多開發者而言,每一次版本升級也意味著又需要刷新技術面,著實是一種痛并快樂的過程。

回顧那么多個版本,你還記得哪些C#的“核心技術”給你帶來過開發效率的巨大提升么?

《C#的核心技術指南》中的核心技術

最近,我有幸閱讀了新出版的《C#8.0核心技術指南》,并在這篇文章中,我摘取了幾個C#相關的新特性和概念跟大家一起分享。當然由于C#實際上是.NET框架的主力語言,以下介紹的一些核心技術,可能實質上是.NET框架的核心技術,大家不用糾結這個問題。

C#9.0新特性

參見https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-9。

C#8.0的新特性

參見https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-8

C#可為空類型

3.1 可為空值類型

可為空值類型是針對基礎類型而言,例如Int?bool?double?這些基礎類型都是我們常用的可為空值類型,該類型出現得比較早,在C#2.0中就已經出現了可為空值類型。

檢查可為空值類型的實例

從C#7.0開始,可以使用is表達式對可為空值類型進行檢查,

  1. int? a = 42; 
  2. if (a is int valueOfA) 
  3.     Console.WriteLine($"a is {valueOfA}"); 
  4. else 
  5.     Console.WriteLine("a does not have a value"); 
  6. // Output
  7. // a is 42 

當然,依然可以使用HasValue這種類型對可為空值類型進行檢查。

3.2 C#可為空引用類型

可為空值類型常用于數據庫的檢查中,可以通過該類型判斷對象是否為空,而可為空引用類型則恰好相反,可以一定程度上防止引用類型的值為空,避免引發 “未將對象引用添加到對象的實例”這樣的空指針異常。

該類型自C#8.0 引入,包括兩種方式“可為空引用類型”和“不可為空引用類型”,使你能夠對引用類型變量的屬性作出重要聲明 :

  • 引用不應為 null。當變量不應為 null 時,編譯器會強制執行規則,以確保在不首先檢查它們是否為 null 的情況下,取消引用這些變量是安全的:
  • 必須將變量初始化為非 null 值。
  • 變量永遠不能賦值為 null。
  • 引用可為 null。當變量可以為 null 時,編譯器會強制執行不同的規則以確保你已正確檢查空引用:
  • 只有當編譯器可以保證該值不為 null 時,才可以取消引用該變量。
  • 這些變量可以使用默認的 null 值進行初始化,也可以在其他代碼中賦值為 null。類型為 Null 性

例如,在常用的語句中,我們可能這樣實現:

  1. void foo(string? s)=>Console.WriteLine(s.Length); 

一旦出現了string為空的情況,可能很容易就會引發空指針異常。

可為空上下文

可為空上下文可以對編譯器如何解釋引用類型變量進行精細控制。

可以使用 .csproj 文件中的 Nullable 元素為項目設置可為空注釋上下文和可為空警告上下文。此元素配置編譯器如何解釋類型的為 Null 性以及生成哪些警告。有效設置如下:

  1. enable 

:“啟用”可為空注釋上下文。“啟用”可為空警告上下文。

引用類型的變量,例如 string 是“不可為空”。啟用所有為 Null 性警告。

  1. warnings 

:“禁用”可為空注釋上下文。“啟用”可為空警告上下文。

引用類型的變量是“無視”。啟用所有為 Null 性警告。

  1. annotations 

:“啟用”可為空注釋上下文。“禁用”可為空警告上下文。

引用類型的變量(例如字符串)不可為 null。禁用所有為 Null 性警告。

  1. disable 

:“禁用”可為空注釋上下文。“禁用”可為空警告上下文。

引用類型的變量是“無視”,就像早期版本的 C# 一樣。禁用所有為 Null 性警告。

示例:

XML復制

  1. <Nullable>enable</Nullable> 

你還可以使用指令在項目的任何位置設置這些相同的上下文:

  • #nullable enable:將可為空注釋上下文和可為空警告上下文設置為“已啟用”。
  • #nullable disable:將可為空注釋上下文和可為空警告上下文設置為“已禁用”。
  • #nullable restore:將可為空注釋上下文和可為空警告上下文還原到項目設置。
  • #nullable disable warnings:將可為空警告上下文設置為“已禁用”。
  • #nullable enable warnings:將可為空警告上下文設置為“已啟用”。
  • #nullable restore warnings:將可為空警告上下文還原到項目設置。
  • #nullable disable annotations:將可為空注釋上下文設置為“禁用”。
  • #nullable enable annotations:將可為空注釋上下文設置為“啟用”。
  • #nullable restore annotations:將注釋警告上下文還原到項目設置。

屬性模式

C#在7.0中引入了屬性模式,通過該模式,可以快速匹配對象的一個或多個屬性值。例如,我們可以使用這樣的示例快速匹配相關屬性值。

  1. if (obj is string s && s.Length=4)  

除了這種屬性模式,還有一種是C#8.0中引入的模式,該模式主要用于switch語句的用法,使用起來也非常簡潔。

  1. bool ShouldAllow(Url url)=>url switch   
  2. {   
  3.      {Scheme:"http",Port=80}=>true,   
  4.      {Scheme:"https",port=443}=>true   
  5. }   

屬性模式還支持嵌套,例如

  1. bool ShouldAllow(Url url)=>url switch   
  2. {  
  3.      {Scheme:string{Length:4},Port=80}=>true,  
  4.      {Scheme:"https",port=443}=>true  
  5. }   

甚至支持使用when子句。例如:

  1. {Scheme:"http",Port:80} when url.Host.Length<1000=>true,   

這樣的寫法可以使我們部分邏輯代碼變得更加精簡,看起來更有逼格。

屬性還提供了元組模式,位置模式兩種模式,元組模式提供了切換多個值的簡單機制,而位置模式則定義了使用對象的位置屬性作為匹配模式的方式。

以下是官方文檔關于位置模式的示例。

  1. public readonly struct Point  
  2. {  
  3.     public int X { get; }  
  4.     public int Y { get; }   
  5.  
  6.     public Point(int x, int y) => (X, Y) = (x, y); 
  7.  
  8.     public void Deconstruct(out int x, out int y) => (x, y) = (X, Y); 
  9.  
  10. static string Classify(Point point) => point switch 
  11.     (0, 0) => "Origin",   
  12.     (1, 0) => "positive X basis end",  
  13.     (0, 1) => "positive Y basis end",  
  14.     _ => "Just a point",  
  15. };  

不過,官方文檔并沒有介紹元組模式的示例,而《C#8.0核心技術指南》中介紹了該模式的用法,大家可以從書中獲取相關知識。

Json處理

過去,我們傾向于使用Json.NET來處理C#中的Json序列化問題,而現在,我們則可以依托官方庫Sytem.Text.Json來完成。(雖然我們有時可能不愿意用,但往后官方的許多方法會更多的依賴該庫來實現)。相比json.net,該官方庫的主要優點是更簡單、高效并且內存使用效率更高。

官方庫提供了如下幾種操作形式:

1、Utf8JsonReader:這是一種優化的前向Json讀取器,用于讀取Utf8編碼的Json文本。

2、Uft8JsonWriter:這是一種Json輸出器,可用于輸出Utf8編碼Json文本。

3、JsonDocument:該類型可以將Json數據解析為只讀的DOM,可以用類似于XMLDocument的方式操作延遲加載的JsonElement示例。同時,也可以用JsonDocument讀取對象,并使用Json寫入器對Json進行更新。

Span和Memory

Span和Memory是.NET 5中引入的新的結構體。是數組、字符串或任意連續的托管內存或非托管內存結構的底層抽象,其主要目的是進行特定的微優化,尤其是編寫需要盡可能降低內存分配(從而減輕垃圾回收器負載)的低內存分配代碼。

Span和Memory適用于各種性能熱點,例如Asp.NET CORE的處理流水線以及字節流的解析等操作常見,具有更佳的性能。Span 是在堆棧上分配的 引用結構[1] ,而不是在托管堆上分配的。

Span表示任意內存的連續區域。以下為官方文檔提供的示例:

  1. // Create a span over an array. 
  2. var array = new byte[100]; 
  3. var arraySpan = new Span<byte>(array); 
  4.  
  5. byte data = 0; 
  6. for (int ctr = 0; ctr < arraySpan.Length; ctr++) 
  7.     arraySpan[ctr] = data++; 
  8.  
  9. int arraySum = 0; 
  10. foreach (var value in array) 
  11.     arraySum += value; 
  12.  
  13. Console.WriteLine($"The sum is {arraySum}"); 
  14. // Output:  The sum is 4950 

由于 Span 是任意內存塊的抽象,因此 Span 具有參數的類型和方法的方法將 Span 在任何對象上操作, Span 而不考慮它所封裝的內存類型。

Span 包含方法的兩個重載 Slice[2] ,該方法構成從指定索引處開始的當前范圍的切片。這樣一來,就可以將中的數據 Span 作為一組邏輯塊進行處理,數據處理管道的部分可以按需處理這些數據塊,并對性能的影響最小。例如,由于新式服務器協議通?;谖谋?,因此字符串和子字符串的操作非常重要。

可以使用或刪除此分配和復制操作 Span ReadOnlySpan[3] ,如下面的示例所示:

  1. using System; 
  2.  
  3. class Program 
  4.     static void Main() 
  5.     { 
  6.         string contentLength = "Content-Length: 132"
  7.         var length = GetContentLength(contentLength.ToCharArray());     
  8.         Console.WriteLine($"Content length: {length}");  
  9.     } 
  10.  
  11.     private static int GetContentLength(ReadOnlySpan<char> span) 
  12.     { 
  13.         var slice = span.Slice(16); 
  14.         return int.Parse(slice);     
  15.     } 
  16. // Output
  17. //      Content length: 132 

結語

由于時間關系,本文僅對部分內容進行了簡單整理,尚不足以對C#核心技術進行總結,而最適合深度了解C#核心技術的方式,除了通過官方學習網站來了解,可能就是獲得一本深度介紹C#核心技術的書籍,跟著作者的節奏來接觸相關知識體系,了解相關代碼,并手把手的練上一練。

而雖然市場上目前介紹C#相關技術書籍比較多,我比較推薦機械工業出版社華章IT出版的這本《C#8核心技術指南》。作者的介紹也提到,這本書將回答你在C#8.0或.NET CORE學習過程中遇到的各種問題,該書圍繞概念和用例進行組織,不但為中高級程序員提供了簡明的C#和.NET知識體系,還進行了一系列深度探索。

 

雖然目前最新的C#已經刷新到10.0預覽版,但翻譯書的出版速度可能并沒有那么快,即使是C#9.0,也最快要到明年出版,所以這本《C#8核心技術指南》算是市場上介紹C#8最成熟、最系統的的書籍。

 

責任編輯:武曉燕 來源: DotNET技術圈
相關推薦

2020-12-10 11:00:37

JavaJVM命令

2021-11-26 00:02:12

OpenGauss 數據庫SQL

2009-06-26 16:01:39

EJB組織開發EJB容器EJB

2019-04-30 13:54:55

大數據Hadoop數據清洗

2020-12-11 13:27:12

大數據大數據技術

2022-05-07 14:31:46

物聯網

2016-02-25 09:31:02

2018-08-30 10:33:28

智能

2017-05-08 13:37:32

IaaS核心虛擬化

2017-03-08 10:06:11

Java技術點注解

2023-06-14 08:49:22

PodKubernetes

2016-11-15 14:33:05

Flink大數據

2024-10-08 10:44:32

2009-06-15 17:54:50

Java核心技術

2022-05-09 08:21:29

Spring微服務Sentinel

2015-01-12 09:48:15

云計算分布式虛擬化

2011-06-15 14:45:26

上網行為管理技術

2020-04-06 20:11:26

區塊鏈分布式核心技術

2018-03-02 09:04:08

虛擬化存儲云存儲

2017-04-26 23:10:03

數據組織數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美久久一区二区三区 | 天天躁日日躁狠狠的躁天龙影院 | 免费一区二区三区 | 人干人人 | 国产精品视频免费播放 | 高清人人天天夜夜曰狠狠狠狠 | 久久久久国产 | 国产精品久久久久久久三级 | 成人国产精品免费观看视频 | 国产精品永久 | 国产成人99久久亚洲综合精品 | 国产1区 | 日韩欧美国产精品 | 久久亚洲国产精品 | 亚洲国产精品成人 | 91看片网 | 激情六月丁香婷婷 | 国产成人综合网 | 紧缚调教一区二区三区视频 | 亚洲人在线播放 | 日韩欧美精品一区 | 精品久久久久久亚洲精品 | 国产成人精品一区二区在线 | 久草免费在线视频 | 紧缚调教一区二区三区视频 | 国产精品欧美一区二区三区不卡 | 成人1区2区 | 先锋av资源网 | 99精品免费| 日本欧美国产在线 | 国产一级片久久久 | 欧美日韩精品免费观看 | 亚洲国产看片 | 99re99| 91视频在线看 | 欧美日韩精品一区二区 | 国产精品二区三区在线观看 | 精品欧美一区二区三区久久久 | 国产精品欧美日韩 | 视频在线h | 人人叉 |